新闻资讯

新闻资讯 行业动态

php经典趣味算法

编辑:011     时间:2020-02-28
许多人在学习C语言的时候都写过一些有趣的算法,其实这些算法在PHP中也同样可以实现,甚至有些算法的代码比C语言中还要简洁。

了解更多的php小知识可以点击我们

1、一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

functionking($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到数组

    }

    returncurrent($monkeys);  //猴子数量等于1时输出猴子标号,得出猴王

}

echoking(6,3);


2、有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。

1

2

3

4

5

6

7

8

9

10

11

12

functionniu($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

        }elseif($i==20){          

        $num--;                         //20岁死亡减一

        }

    return$num;

}

}

3、杨辉三角

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

<?php

/* 默认输出十行,用T(值)的形式可改变输出行数 */

classT{

  private$num;

  publicfunction__construct($var=10) {

    if($var<3)die("值太小啦!");

    $this->num=$var;

  }

  publicfunctiondisplay(){

    $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;

    echostr_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)

          echostr_pad(" ",($n+1-$i)*12," ");

        printf("%3d",$arr[$i][$j]=$arr[$i-1][$j-1]+$arr[$i-1][$j]);

        echo"  ";

      }

      echo"<br/>";

    }

  }

}

$yh=newT('3');//$yh=new T(数量);

$yh->display();

?>

4.冒泡排序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

functionmaopao($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.快速排序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

functionquickSort($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);

    //合并

  

    returnarray_merge($left_array,array($base_num),$right_array);

}

6.二分查找算法(折半查找算法)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

functionbinsearch($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;

        }

    }

    returnfalse;

}

7.PHP奇异算法

1

2

3

4

5

6

7

<?php

functiontest(){

 $a=1;

 $b=&$a;

 echo(++$a)+(++$a);

}

test();

PHP7以下的版本返回的是 6,PHP7版本返回5 ,还真的算奇异,个人底层算法差,认为是PHP7以下版本的BUG

8.字符集合:输入一个字符串,求出该字符串包含的字符集合,并按顺序排序(英文)

1

2

3

4

5

6

7

8

9

10

functionset($str){

    //转化为数组

    $arr=str_split($str);

    //去除重复

    $arr=array_flip(array_flip($arr));

    //排序

    sort($arr);

    //返回字符串

    returnimplode('',$arr);

}

9.遍历一个文件下的所有文件和子文件夹下的文件

1

2

3

4

5

6

7

8

9

10

11

12

13

functionAllFile($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提取出文件的扩展名

1

2

3

4

5

6

7

functiongetExt($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中方式

1

2

3

functionjieti($num){  //实际上是斐波那契数列

        return$num<2?1:jieti($num-1)+jieti($num-2);

    }

12.请写一段PHP代码,确保多个进程同时写入同一个文件成功

1

2

3

4

5

6

7

8

9

10

11

12

13

<?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.无限级分类

1

2

3

4

5

6

7

8

9

10

11

12

functiontree($arr,$pid=0,$level=0){

        static$list=array();

        foreach($arras$v) {

            //如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点

            if($v['pid'] ==$pid) {

                $v['level'] =$level;

                $list[] =$v;

                tree($arr,$v['id'],$level+1);

            }

        }

        return$list;

    }

14.获取上个月第一天 和 最后一天

1

2

3

4

5

//获取上个月第一天

    date('Y-m-01',strtotime('-1 month'));

  

    //获取上个月最后一天

    date('Y-m-t',strtotime('-1 month'));

15.随机输入一个数字能查询到对应的数据区间

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

//把区间换成数组写法,用二分法查找区间

    functionbinsearch($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';

    echobinsearch($a,$array);


————————————————
版权声明:

遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.php.cn/jishu/php/425831.html


郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐