PHP解決羊生羊的問題。

面試題一:農夫有一隻羊,這隻羊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;
        }
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章