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 相关文章推荐
第1次亲密接触PHP5(1)
Oct 09 PHP
NT IIS下用ODBC连接数据库
Oct 09 PHP
PHP has encountered an Access Violation
Jan 15 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
Nov 12 PHP
php获取数组长度的方法(有实例)
Oct 27 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
php去除数组中重复数据
Nov 18 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
Mar 17 PHP
微信公众号开发客服接口实例代码
Oct 21 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
php实现的二叉树遍历算法示例
Jun 15 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 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
PHP数据类型之布尔型的介绍
2013/04/28 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
php的闭包(Closure)匿名函数详解
2015/02/22 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
PHP随机获取未被微信屏蔽的域名(微信域名检测)
2017/03/19 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
javascript 打印页面代码
2009/03/24 Javascript
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
firefox插件Firebug的使用教程
2010/01/02 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
JS 对象属性相关(检查属性、枚举属性等)
2015/04/05 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
Python网页解析器使用实例详解
2020/05/30 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
新东方旗下远程教育网站:新东方在线
2020/03/19 全球购物
捷科时代的软件测试笔试题
2015/11/09 面试题
农民工工资支付承诺函
2014/03/31 职场文书
市场部经理岗位职责
2014/04/10 职场文书
我的长生果教学反思
2014/04/28 职场文书
大型会议策划方案
2014/05/17 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
2015入党个人自传范文
2015/06/26 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫
Java设计模式中的命令模式
2022/04/28 Java/Android
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android