php经典趣味算法实例代码(2)

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1792.html