面試題一:農夫有一隻羊,這隻羊2年後會生一隻小羊,5年後羊會死亡,生出來的小羊也是這個規律,2年生一隻小羊,5年死亡。
問10年後,這個農夫會有多少羊。
這是一個程序題,如果面到這個題目的時候,如果從數學的角度去考慮這個問題,估計面試官沒有這個耐心等我們把這個規律找出來。從程序的角度考慮,這道題就簡單多了,只需要記錄每隻羊的年紀,,他的年紀到了2的倍數就生一個小羊,超過了5年,就殺死他。
// 記錄每隻羊的編號和年齡
$sheeps = array(
0 => 0,
);
for($i = 1; $i <= 6; $i++) {
// 每年都計算一下羊的個數
$tatolSheeps = count($sheeps);
for($j=0; $j < $tatolSheeps; $j++) {
// 每過一年,所有的羊的年紀大一歲
$sheeps[$j]++;
// 超過5歲,就把這隻羊殺掉
if ($sheeps[$j] >= 5) {
unset($sheeps[$j]);
}
else if ($sheeps[$j] % 2 == 0) {
// 生一隻小羊,歲數爲0
$sheeps[] = 0;
}
}
}
echo count($sheeps);
以上的解法,當年數不超過5年的時候沒有問題,一旦超過5年,即有羊死亡,就會出現問題。
// 第五年的數組
Array
(
[1] => 3
[2] => 1
[3] => 1
)
// 第六年的數組
Array
(
[1] => 4
[2] => 2
[3] => 1
[0] => 1
[4] => 0
[5] => 0
)
而正常來說,第三隻羊的歲數應該是2歲,不應該有[0] => 1這樣奇怪的羊,應該有一個羊爲[6]=>0第六年的數組應該是:
Array
(
[1] => 4
[2] => 2
[3] => 2
[4] => 0
[5] => 0
[6] => 0
)
問題就出現在,當我刪除一個羊的時候。比如,第五年,我一共有3只羊,我刪除了第一隻羊,因爲他的歲數已經是5歲了,在第六年做for循環的時候,當$j=0時,已經找不到第一隻羊了,因爲這個羊已經被我刪除了,這裏就是爲什麼出現了[0] => 1這樣奇怪的羊。同時,$j只能取到2,也就是說,我的第三隻羊,即下標爲3的羊取不到了。
這個可以使用foreach來避免這樣的問題。
$sheeps = array(
0 => 0,
);
for ($i = 1; $i <= 5; $i++) {
foreach ($sheeps as $key => $sheep) {
$sheeps[$key]++;
if ($sheeps[$key] >= 5) {
unset($sheeps[$key]);
}
else if ($sheeps[$key] % 2 == 0) {
$sheeps[] = 0;
}
}
}
面試題二:冒泡排序
$arr = array(1,3,56,22,33,12,19,29,90,12);
$count = count($arr);
for ($i=0; $i < $count; $i++) {
for ($j=0; $j < $count-$i-1; $j++) {
if ($arr[$j] > $arr[$j+1]) {
$k = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $k;
}
}
}