您好,登錄后才能下訂單哦!
1、一群猴子排成一圈,按1,2,…,n依次編號。然后從第1只開始數,數到第m只,把它踢出圈,從它后面再開始數,再數到第m只,在把它踢出去…,如此不停的進行下去,直到最后只剩下一只猴子為止,那只猴子就叫做大王。要求編程模擬此過程,輸入m、n, 輸出最后那個大王的編號。
function king($n, $m){ $monkeys = range(1, $n); //創建1到n數組 $i=0; while (count($monkeys)>1) { //循環條件為猴子數量大于1 if(($i+1)%$m==0) { //$i為數組下標;$i+1為猴子標號 unset($monkeys[$i]); //余數等于0表示正好第m個,刪除,用unset刪除保持下標關系 } else { array_push($monkeys,$monkeys[$i]); //如果余數不等于0,則把數組下標為$i的放最后,形成一個圓形結構 unset($monkeys[$i]); } $i++;//$i 循環+1,不斷把猴子刪除,或 push到數組 } return current($monkeys); //猴子數量等于1時輸出猴子標號,得出猴王 }
echo king(6,3);復制代碼2、有一母牛,到4歲可生育,每年一頭,所生均是一樣的母牛,到15歲絕育,不再能生,20歲死亡,問n年后有多少頭牛。
function niu($y){ static $num= 1; //定義靜態變量;初始化牛的數量為1 for ($i=1; $i <=$y ; $i++) { if($i>=4 && $i<15){ //每年遞增來算,4歲開始+1,15歲不能生育 $num++; niu($y-$i); //遞歸方法計算小牛$num,小牛生長年數為$y-$i }else if($i==20){ $num--; //20歲死亡減一 } return $num; } }
3、楊輝三角
<?php /* 默認輸出十行,用T(值)的形式可改變輸出行數 */ class T{ private $num; public function __construct($var=10) { if ($var<3) die("值太小啦!"); $this->num=$var; } public function display(){ $n=$this->num; $arr=array(); //$arr=array_fill(0,$n+1,array_fill(0,$n+1,0)); $arr[1]=array_fill(0,3,0); $arr[1][1]=1; echo str_pad(" ",$n*12," "); printf("%3d",$arr[1][1]); echo "<br/>"; for($i=2;$i<=$n;$i++){ $arr[$i]=array_fill(0,($i+2),0); for($j=1;$j<=$i;$j++){ if($j==1) echo str_pad(" ",($n+1-$i)*12," "); printf("%3d",$arr[$i][$j]=$arr[$i-1][$j-1]+$arr[$i-1][$j]); echo " "; } echo"<br/>"; } } } $yh=new T('3'); //$yh=new T(數量); $yh->display(); ?>
4.冒泡排序
function maopao($arr){ $len = count($arr); for($k=0;$k<=$len;$k++) { for($j=$len-1;$j>$k;$j--){ if($arr[$j]<$arr[$j-1]){ $temp = $arr[$j]; $arr[$j] = $arr[$j-1]; $arr[$j-1] = $temp; } } } return $arr; }
5.快速排序
function quickSort($arr) { //先判斷是否需要繼續進行 $length = count($arr); if($length <= 1) { return $arr; } //選擇第一個元素作為基準 $base_num = $arr[0]; //遍歷除了標尺外的所有元素,按照大小關系放入兩個數組內 //初始化兩個數組 $left_array = array(); //小于基準的 $right_array = array(); //大于基準的 for($i=1; $i<$length; $i++) { if($base_num > $arr[$i]) { //放入左邊數組 $left_array[] = $arr[$i]; } else { //放入右邊 $right_array[] = $arr[$i]; } } //再分別對左邊和右邊的數組進行相同的排序處理方式遞歸調用這個函數 $left_array = quickSort($left_array); $right_array = quickSort($right_array); //合并 return array_merge($left_array, array($base_num), $right_array); }
6.二分查找算法(折半查找算法)
function binsearch($x,$a){ $c=count($a); $lower=0; $high=$c-1; while($lower<=$high){ $middle=intval(($lower+$high)/2); if($a[$middle]>$x){ $high=$middle-1; } elseif($a[$middle]<$x){ $lower=$middle+1; } else{ return $middle; } } return false; }
7.PHP奇異算法
<?php function test(){ $a=1; $b=&$a; echo (++$a)+(++$a); } test();
PHP7以下的版本返回的是 6,PHP7版本返回5 ,還真的算奇異,個人底層算法差,認為是PHP7以下版本的BUG8.字符集合:輸入一個字符串,求出該字符串包含的字符集合,并按順序排序(英文)
function set($str){ //轉化為數組 $arr = str_split($str); //去除重復 $arr = array_flip(array_flip($arr)); //排序 sort($arr); //返回字符串 return implode('', $arr); }
9.遍歷一個文件下的所有文件和子文件夾下的文件
function AllFile($dir){ if($dh = opendir($dir)){ while (($file = readdir($dh)) !== false){ if($file !='..' && $file !='.'){ if(is_dir($dir.'/'.$file)){ AllFile($dir.'/'.$file); //如果判斷還是文件,則遞歸 }else{ echo $file; //輸出文件名 } } } } }
10.從一個標準的Url提取出文件的擴展名
function getExt($url) { $arr = parse_url($url); $file = basename($arr['path']);// basename函數返回路徑中的文件名部分 $ext = explode('.', $file); return $ext[count($ext)-1]; }復制代碼11.有個人想上一個n級的臺階,每次只能邁1級或者邁2級臺階,問:這個人有多少種方法可以把臺階走完?例如:總共3級臺階,可以先邁1級再邁2級,或者先邁2級再邁1級,或者邁3次1級總共3中方式function jieti($num){ //實際上是斐波那契數列 return $num<2?1:jieti($num-1)+jieti($num-2); }復制代碼12.請寫一段PHP代碼,確保多個進程同時寫入同一個文件成功<?php $fp = fopen("lock.txt","w+"); if (flock($fp,LOCK_EX)) { //獲得寫鎖,寫數據 fwrite($fp, "write something"); // 解除鎖定 flock($fp, LOCK_UN); } else { echo "file is locking..."; } fclose($fp); ?>
13.無限級分類
function tree($arr,$pid=0,$level=0){ static $list = array(); foreach ($arr as $v) { //如果是頂級分類,則將其存到$list中,并以此節點為根節點,遍歷其子節點 if ($v['pid'] == $pid) { $v['level'] = $level; $list[] = $v; tree($arr,$v['id'],$level+1); } } return $list; }
14.獲取上個月第一天 和 最后一天//獲取上個月第一天
date('Y-m-01',strtotime('-1 month')); //獲取上個月最后一天 date('Y-m-t',strtotime('-1 month'));復制代碼15.隨機輸入一個數字能查詢到對應的數據區間//把區間換成數組寫法,用二分法查找區間 function binsearch($x,$a){ $c=count($a); $lower=0; $high=$c-1; while($lower<=$high){ $middle=intval(($lower+$high)/2); if($a[$middle]>=$x){ $high=$middle-1; }elseif($a[$middle]<=$x ){ $lower=$middle+1; } } return '在區間'.$a[$high].'到'.$a[$lower]; } $array = ['1','50','100','150','200','250','300']; $a = '120'; echo binsearch($a,$array);
以上就是PHP 有趣的經典算法的詳細內容,更多請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。