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