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目录导航文件代码
Oct 09 PHP
php 小乘法表实现代码
Jul 16 PHP
基于PHP 面向对象之成员方法详解
May 04 PHP
php遍历目录方法小结
Mar 10 PHP
php简单实现无限分类树形列表的方法
Mar 27 PHP
PHP中你应该知道的require()文件包含的正确用法
Jun 12 PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 PHP
PHP编写RESTful接口
Feb 23 PHP
Smarty模板简单配置与使用方法示例
May 23 PHP
在php的yii2框架中整合hbase库的方法
Sep 20 PHP
PHP 7.4 新语法之箭头函数实例详解
May 09 PHP
Laravel使用Queue队列的技巧汇总
Sep 02 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实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
调试PHP程序的多种方法介绍
2014/11/06 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
jquery检测input checked 控件是否被选中的方法
2014/03/26 Javascript
node.js操作mongodb学习小结
2015/04/25 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
20行js代码实现的贪吃蛇小游戏
2017/06/20 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
微信小程序如何修改本地缓存key中单个数据的详解
2019/04/26 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
如何把外网python虚拟环境迁移到内网
2020/05/18 Python
python线程优先级队列知识点总结
2021/02/28 Python
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
Linux开机引导的步骤是什么
2015/10/19 面试题
原告离婚代理词
2015/05/23 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书