題目:php
n個猴子圍坐一圈,從第一個猴子開始數,到第m個出列,求最後一個猴子的編號.c++
分析:算法
首先想到循環,而後隊列,而後堆,因此用數組模擬一個循環的列表,下標爲[0-(n-1)],下標+1整除m幹掉元素,不然加入隊尾,幹掉原來的元素,數據庫
實現:數組
1 <?php 2 echo getLastOne(6,2); 3 4 function getLastOne($n,$m){ 5 $arr=range(1,$n); 6 $i= 0; 7 while(count($arr)!=1){ 8 9 if(($i+1)%$m==0){ 10 unset($arr[$i]); 11 }else{ 12 $arr[]=$arr[$i]; //array_push()也是調用這個 13 unset($arr[$i]); 14 } 15 $i++; 16 } 17 return $arr[$i]; 18 }
引伸:php7
(-)指定從第x個開始數.優化
1 $arr1 = array_slice($arr,0,$x); 2 $arr2 = array_slice($arr,$x); 3 foreach($arr1 as $k){ 4 $arr2[] = $k; 5 } 6 7 $arr=$arr2;
(=)遞推優化spa
1 $i=0; 2 for($i=2;$i<=$m;$i++){ 3 $res=0; 4 $res=($i+$m)%$n; 5 } 6 return $res+1;
//反向遞推
這玩意裝b有用,主要是掌握這種計算和優化的思想.大量的算法主要是c和c++的底層實現,相對於php扁平化的敏捷開發,數據庫纔是瓶頸.(php7以後yaf要大興)code