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)碌奉。
/**
* @param $m
* @param $n
* @return mixed
*
*/
private function monkeysKing($m, $n)
{
//創(chuàng)建猴群 - 1到n數(shù)組
$monkeys = range(1, $m);
//循環(huán)條件 - 猴子數(shù)量大于1
$i = 0;//數(shù)組下標(biāo)
while (count($monkeys) > 1) {
//$i為數(shù)組下標(biāo);$i+1為猴子標(biāo)號(hào)
//余數(shù)等于0表示正好第m個(gè)短曾,刪除,用unset刪除保持下標(biāo)關(guān)系
if (($i + 1) % $n == 0) {
unset($monkeys[$i]);
} else {
//如果余數(shù)不等于0赐劣,則把數(shù)組下標(biāo)為$i的放最后嫉拐,形成一個(gè)圓形結(jié)構(gòu),
array_push($monkeys, $monkeys[$i]);
//圓形結(jié)構(gòu),添加一個(gè)魁兼,就要去掉一個(gè)
unset($monkeys[$i]);
}
//$i 循環(huán)+1婉徘,不斷把猴子刪除漠嵌,或 push到數(shù)組
$i++;
}
//猴子數(shù)量等于1時(shí)輸出猴子標(biāo)號(hào),得出猴王
return current($monkeys);
}
2.牛群算法
有一頭母牛盖呼,4歲可生育儒鹿,每年生一頭,所生均是母牛几晤,到15歲絕育不再能生约炎,20歲死亡。問(wèn)n年后有多少頭牛蟹瘾?
/**
* @param $y
* @return int
*/
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.楊輝三角
private function Triangle($n)
{
$arr = array();
$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/>";
}
}
4.冒泡排序
/**
* @param $arr
* @return mixed
*
* 冒泡排序算法的原理如下:
* 1.比較相鄰的元素狸捕。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)众雷。
* 2.對(duì)每一對(duì)相鄰元素做同樣的工作灸拍,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)。在這一點(diǎn)砾省,最后的元素應(yīng)該會(huì)是最大的數(shù)鸡岗。
* 3.針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)纯蛾。
* 4.持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟纤房,直到?jīng)]有任何一對(duì)數(shù)字需要比較。
*/
private function bubbleSort($arr)
{
//獲取 長(zhǎng)度
$len = count($arr);
//循環(huán)比較(相鄰的兩個(gè)元素翻诉,比較炮姨,交換)
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.快速排序
/**
* @param $arr
* @return array
*
* 快速排序算法原理如下:
* 1.通過(guò)設(shè)置一個(gè)初始中間值,來(lái)將需要排序的數(shù)組分成3部分:小于中間值的左邊碰煌,中間值舒岸,大于中間值的右邊
* 2.繼續(xù)遞歸用相同的方式來(lái)排序左邊和右邊
* 3.最后合并數(shù)組
*/
private function quickSort($arr)
{
//先判斷要排序的數(shù)據(jù)是否符合要求
$length = count($arr);
if ($length <= 1) {
return $arr;
}
//選擇一個(gè)數(shù)作為參照
$base_num = $arr[0];
//遍歷除了參照外的所有元素,按照大小關(guān)系放入兩個(gè)數(shù)組內(nèi)
//初始化兩個(gè)數(shù)組
$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];
}
}
//在分別對(duì)這兩個(gè)數(shù)組進(jìn)行遞歸處理
$left_array = $this->quickSort($left_array);
$right_array = $this->quickSort($right_array);
//合并數(shù)組并輸出
return array_merge($left_array, array($base_num), $right_array);
}
6.二分查找算法(折半查找算法)
/**
* @param $x
* @param $a
* @return bool|int
*
* 二分查找,需要數(shù)組是一個(gè)有序數(shù)組
* 循環(huán)實(shí)現(xiàn)
*/
private function binLoop($x, $a)
{
$c = count($a);
$lower = 0;
$high = $c - 1;
while ($lower <= $high) {
//取中間值
$middle = intval(($lower + $high) / 2);//intval() 函數(shù)用于獲取變量的整數(shù)值
//比較(一半一半的比),必須是有序數(shù)組
if ($a[$middle] > $x) {
$high = $middle - 1;//在前一半里查
} elseif ($a[$middle] < $x) {
$lower = $middle + 1;//在后一半里查
} else {
return $middle;
}
}
return false;
}
/**
* @param $x
* @param $a
* @param $lower
* @param $high
* @return bool|int
*
* 二分查找,需要數(shù)組是一個(gè)有序數(shù)組
* 遞歸實(shí)現(xiàn)
*/
private function binRecursive($x, &$a, $lower = 0, $high = 11)
{
//$lower開(kāi)始位置 $high結(jié)束位置
//采用二分法查找
$c = count($a);
if ($high > $c) {
return false;
}
if ($lower <= $high) {
$middle = intval(($lower + $high) / 2);
if ($a[$middle] == $x) {
return $middle;
} elseif ($a[$middle] < $x) {//在后半段里查
return $this->binSearchRecursive($x, $a, $middle + 1, $high);
} else {//在前半段里查
return $this->binSearchRecursive($x, $a, $lower, $middle - 1);
}
} else {
return false;
}
}
7.遍歷一個(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; //輸出文件名
}
}
}
}
}
8.請(qǐng)寫(xiě)一段PHP代碼蛾派,確保多個(gè)進(jìn)程同時(shí)寫(xiě)入同一個(gè)文件成功
<?php
$fp = fopen("lock.txt","w+");
if (flock($fp,LOCK_EX)) {
//獲得寫(xiě)鎖,寫(xiě)數(shù)據(jù)
fwrite($fp, "write something");
// 解除鎖定
flock($fp, LOCK_UN);
} else {
echo "file is locking...";
}
fclose($fp);
?>
9.無(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;
}
10.隨機(jī)輸入一個(gè)數(shù)字能查詢到對(duì)應(yīng)的數(shù)據(jù)區(qū)間
//把區(qū)間換成數(shù)組寫(xiě)法夜焦,用二分法查找區(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);