php经典趣味算法实例代码


Posted in PHP onJanuary 21, 2020

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以下版本的BUG

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

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经典趣味算法的详细内容,更多内容请关注三水点靠木以前发布的文章。

PHP 相关文章推荐
php 页面执行时间计算代码
Dec 04 PHP
php 获取当前访问的url文件名的方法小结
Feb 08 PHP
无法载入 mcrypt 扩展,请检查 PHP 配置终极解决方案
Jul 18 PHP
php中生成随机密码的自定义函数代码
Oct 21 PHP
php安装xdebug/php安装pear/phpunit详解步骤(图)
Dec 22 PHP
PHP中HTML标签过滤技巧
Jan 07 PHP
php采集内容中带有图片地址的远程图片并保存的方法
Jan 03 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
微信公众平台之快递查询功能用法实例
Apr 14 PHP
PHP嵌套输出缓冲代码实例
May 12 PHP
PHP 返回13位时间戳的实现代码
May 13 PHP
Laravel框架定时任务2种实现方式示例
Dec 08 PHP
php利用ZipArchive类操作文件的实例
Jan 21 #PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 #PHP
Laravel 集成微信用户登录和绑定的实现
Dec 27 #PHP
PHP单元测试配置与使用方法详解
Dec 27 #PHP
PHP全局使用Laravel辅助函数dd
Dec 26 #PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 #PHP
PHP高并发和大流量解决方案整理
Dec 24 #PHP
You might like
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
IE8下关于querySelectorAll()的问题
2010/05/13 Javascript
javascript中length属性的探索
2011/07/31 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
JS+CSS实现带关闭按钮DIV弹出窗口的方法
2015/02/27 Javascript
javascript实现验证IP地址等相关信息代码
2015/05/10 Javascript
JS更改select内option属性的方法
2015/10/14 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
javascript创建对象、对象继承的实用方式详解
2016/03/08 Javascript
HTML5 canvas 9绘制图片实例详解
2016/09/06 Javascript
JS基于递归实现网页版计算器的方法分析
2017/12/20 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
python访问系统环境变量的方法
2015/04/29 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
python随机取list中的元素方法
2018/04/08 Python
解决python升级引起的pip执行错误的问题
2018/06/12 Python
Python实现遗传算法(二进制编码)求函数最优值方式
2020/02/11 Python
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
python用tkinter实现一个gui的翻译工具
2020/10/26 Python
用纯CSS3实现网页中常见的小箭头
2017/10/16 HTML / CSS
销售总监工作职责
2013/11/21 职场文书
主管会计岗位职责
2014/03/13 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
学校四群教育实施方案
2014/06/12 职场文书
2014幼儿教师个人工作总结
2014/12/03 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技