你應(yīng)該熟悉的10個(gè)PHP常見(jiàn)算法

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);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壳澳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茫经,更是在濱河造成了極大的恐慌巷波,老刑警劉巖萎津,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異抹镊,居然都是意外死亡锉屈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)垮耳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)颈渊,“玉大人,你說(shuō)我怎么就攤上這事氨菇±芰叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵查蓉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我榜贴,道長(zhǎng)豌研,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任唬党,我火速辦了婚禮鹃共,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驶拱。我一直安慰自己霜浴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布蓝纲。 她就那樣靜靜地躺著阴孟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪税迷。 梳的紋絲不亂的頭發(fā)上永丝,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音箭养,去河邊找鬼慕嚷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛毕泌,可吹牛的內(nèi)容都是我干的喝检。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼撼泛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挠说!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起坎弯,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纺涤,失蹤者是張志新(化名)和其女友劉穎译暂,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體撩炊,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡外永,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拧咳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伯顶。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖骆膝,靈堂內(nèi)的尸體忽然破棺而出祭衩,到底是詐尸還是另有隱情,我是刑警寧澤阅签,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布掐暮,位于F島的核電站,受9級(jí)特大地震影響政钟,放射性物質(zhì)發(fā)生泄漏路克。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一养交、第九天 我趴在偏房一處隱蔽的房頂上張望精算。 院中可真熱鬧,春花似錦碎连、人聲如沸灰羽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)廉嚼。三九已至,卻和暖如春座每,著一層夾襖步出監(jiān)牢的瞬間前鹅,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工峭梳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舰绘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓葱椭,卻偏偏與公主長(zhǎng)得像捂寿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子孵运,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 約瑟夫問(wèn)題 故事 39個(gè)猶太人與Josephus以及他的朋友躲到一個(gè)洞里秦陋,決定寧愿死也不要被敵人抓到。于是決定了自...
    JunChow520閱讀 1,836評(píng)論 0 13
  • 總結(jié)一下常見(jiàn)的排序算法治笨。 排序分內(nèi)排序和外排序驳概。內(nèi)排序:指在排序期間數(shù)據(jù)對(duì)象全部存放在內(nèi)存的排序赤嚼。外排序:指在排序...
    jiangliang閱讀 1,334評(píng)論 0 1
  • 共享出行模式的存在本就是為了方便人們的出行稚照,而行業(yè)需要整頓和規(guī)范蹂空,商業(yè)模式需要符合社會(huì)發(fā)展的需求就必須服從監(jiān)管部門(mén)...
    耿彪閱讀 367評(píng)論 2 3
  • 在夏老師的引讀下,完完整整的了解了莎士比亞的兩部劰肌:《哈姆雷特》和《羅密歐與朱麗葉》上枕。已經(jīng)在這個(gè)帶領(lǐng)下,我看完了文...
    夏天說(shuō)早安閱讀 355評(píng)論 0 0
  • 女友來(lái)家里,穿了一件普衣路牌子的上衣斤彼,媽媽釘著衣服看了半天分瘦,悄悄地問(wèn)我:“這丫頭怎么穿一件帶蒼蠅的衣服呢?”...
    AprilFriday閱讀 914評(píng)論 0 1