天天看點

PHP面試題:猴子選大王

【題目】一 群猴子排成一圈,按1,2,…,n依次編号。然後從第1隻開始數,數到第m隻,把它踢出圈,從它後面再開始數,再數到第m隻,在把它踢出去…,如此不停的 進行下去,直到最後隻剩下一隻猴子為止,那隻猴子就叫做大王。要求程式設計模拟此過程,輸入m、n, 輸出最後那個大王的編号。

邏輯梳理

将所有的猴子放入數組中;周遊數組,判斷目前猴子序号是否出局,猴子出局直接unset掉,不出局将猴子放到數組最後,繼續輪詢。當數組長度等于1時,結束,傳回結果。

代碼實作

// $n猴子個數 $m第幾個位置
function fn($n, $m)
{
    //将猴子數量放到數組内
    for ($i = 1; $i < $n + 1; $i++) {
        $arr[] = $i;
    }
    $i = 0;
    //當數組内隻剩下一個值跳出數組
    while (count($arr) > 1) {
        //周遊數組,判斷目前猴子是否為出局序号,如果是則出局,否則放到數組最後
        if (($i + 1) % $m == 0) {
            //當循環次數滿足m值 去除掉目前值
            unset($arr[$i]);
        } else {
            //不滿足循環次數 放到數組對尾
            array_push($arr, $arr[$i]);
            //删除掉目前循環内容
            unset($arr[$i]);
        }
        $i++;
    }
    return $arr;
}
// 調用
var_dump(fn(15,7));