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; }
内容版权声明:除非注明,否则皆为本站原创文章。