好几天前,我在鹏寰大厦百度钱包进行了一次面试,
然后最后一道面试题就是版本号排序。
有个产品,有很多版本,版本号是用逗号隔开的数字,如233.211.1.0.1,首先比较第一位,如果相等,则比较第二位...以此类推。如何对他们进行排序?
我拿到这个题目估计出难点应该是大小比较了,我首先想起了php处理ip的函数的思路,但是立马考虑到溢出,所以又问了一下每个数字的范围,果不其然,被告知是整形。这条路就堵死了。
然后我想到了二叉树,但是想了下过程,感觉一时很难实现,这条路也死了。
最后才想到了递归比较。 但是由于是在纸上写的,所以代码凌乱。 现在整理一下 当时想的代码如下,采用的是类似链表的结构:
$a = array(
'value' => 19211111,
'next' => array(
'value' => 168222222,
'next' => array(
'value' => 1,
'next' => array(
'value' => 1,
'next' => array()
)
)
)
);
$b = array(
'value' => 19211111,
'next' => array(
'value' => 168222222,
'next' => array(
'value' => 1,
'next' => array(
'value' => 0,
'next' => array()
)
)
)
);
function compare($f,$s) {
if(!isset($f['value']) && isset($s['value'])) {
return 'small';
}
if(isset($f['value']) && !isset($s['value'])) {
return 'big';
}
if(!isset($f['value']) && !isset($s['value'])) {
return 'equal';
}
if($f['value'] > $s['value'] ){
return 'big';
}
if($f['value'] < $s['value'] ){
return 'small';
}
return compare($f['next'],$s['next']);
}
echo compare($a,$b);
在面试完后,坐在外面的麦当劳里吃饭,想了一下,其实可以简化一下的,代码如下:
$a = '123333333.16811111.1.1';
$b = '123333333.16911111.1.0';
$arra = explode('.',$a);
$arrb = explode('.',$b);
function compare($a,$b) {
$f = array_shift($a);
$s = array_shift($b);
if(!isset($f) && isset($s)) {
return 'small';
}
if(isset($f) && !isset($s)) {
return 'big';
}
if(!isset($f) && !isset($s)) {
return 'equal';
}
if($f > $s ){
return 'big';
}
if($f < $s ){
return 'small';
}
return compare($a,$b);
}
echo compare($arra,$arrb);
当然,后续还要进行冒泡比较,或者快排,或者二叉树排序,这里就不详写了。
php有个函数,可以进行比较,但是没有试过version_compare()
$arr = array('12','1.2.4.3','2.1.3.4','2.1.4.3.3','3.4.1.2','3.4.2.1','4.3.1.2','4.3.2.1','4.4.2.1.4','4.4.1.2');
usort($arr,'version_compare');
$res = array_reverse($arr);
print_r($res);