PHP的文件操作与算法实现的面试题示例
操作文件
1.使用5种以上的方式获取一个文件的扩展名
要求:dir/upload.image.jpg,找出.jpg或者jpg
<?php /** *五种方式获取指定路径的文件扩展名 */ $str="dir/upload.image.jpg"; functionone($str) { $arr=explode('.',$str); $count=count($arr); return$arr[$count-1]; } functiontwo($str) { $len=strlen($str); for($i=$len-1,$name='';$str[$i]!='.';$i--){ $name.=$str[$i]; } $name=strrev($name); return$name; } functionthree($str) { $path=pathinfo($str); return$path['extension']; } functionfour($str) { $arr=explode('.',$str); returnarray_pop($arr); } functionfive($str) { $start=strrpos($str,'.'); returnsubstr($str,$start+1); } echoone($str); echo"<br>"; echotwo($str); echo"<br>"; echothree($str); echo"<br>"; echofour($str); echo"<br>"; echofive($str); echo"<br>";
2.写一个php函数算出两个文件的相对路径。例如$a="/a/b/c/d/e.php";$b="/a/b/12/34/c.php",B相对于A的相对路径是什么?
这道题目可以看成是求第一个公共节点的题目,网上流传的代码大部分是错的,考虑不周全,当然我这个也只是用“../”去表示,没用"./"
<?php /** *求$b相对于$a的相对路径 *@paramstring$a *@paramstring$b *@returnstring */ functiongetRelativePath($a,$b) { $patha=explode('/',$a); $pathb=explode('/',$b); $counta=count($patha)-1; $countb=count($pathb)-1; $path="../"; if($countb>$counta){ while($countb>$counta){ $path.="../"; $countb--; } } //寻找第一个公共结点 for($i=$countb-1;$i>=0;){ if($patha[$i]!=$pathb[$i]){ $path.="../"; $i--; }else{//判断是否为真正的第一个公共结点,防止出现子目录重名情况 for($j=$i-1,$flag=1;$j>=0;$j--){ if($patha[$j]==$pathb[$j]){ continue; }else{ $flag=0; break; } } if($flag) break; else $i++; } } for($i+=1;$i<=$counta;$i++){ $path.=$patha[$i]."/"; } return$path; } $a="/a/c/d/e.php"; $b="/a/c.php"; $path=getRelativePath($a,$b); echo$path;
算法
1.使用PHP描述冒泡排序和快速排序,对象可以是一个数组
<?php /** *冒泡排序算法实现(从小到大) */ functionmaopaoSort(&$array) { $count=count($array); for($i=0;$i<$count-1;$i++){ for($j=0;$j<$count-$i-1;$j++){ if($array[$j]>$array[$j+1]){ $tmp=$array[$j]; $array[$j]=$array[$j+1]; $array[$j+1]=$tmp; } } } } /** *快速排序 */ functionpivotParation(&$array,$start,$end) { $stand=$array[$start]; while($start<$end){ while($start<$end&&$array[$end]>=$stand){ $end--; } if($start<$end){ $array[$start++]=$array[$end]; } while($start<$end&&$array[$start]<=$stand){ $start++; } if($start<$end){ $array[$end--]=$array[$start]; } } $array[$start]=$stand; return$start; } functionquickSort(&$array,$begin,$end) { if($begin<$end){ $pivot=pivotParation($array,$begin,$end); quickSort($array,$begin,$pivot-1); quickSort($array,$pivot+1,$end); } } $arr=array( 5, 1, 3, 2, 19, 11, 25, 12, 100, 10000, 12 ); //冒泡排序 maopaoSort($arr); print_r($arr); echo"<br>"; //快速排序 $count=count($arr); quickSort($arr,0,$count-1); print_r($arr);
2.使用php描述顺序查找和二分查找
<?php /** *顺序查找 */ functionseqSearch($arr,$needle) { for($i=0,$len=count($arr);$i<$len;$i++){ if($arr[$i]==$needle){ return$i; } } return-1; } /** *二分查找 */ functionmidSearch($arr,$start,$end,$needle) { while($start<=$end){ $mid=(int)($start+($end-$start)/2);//防止超出整数表示范围 if($arr[$mid]==$needle){ return$mid; }elseif($arr[$mid]>$needle){ $end=$mid-1; }else{ $start=$mid+1; } } return-1; } $arr=array( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ); $needle=5; echoseqSearch($arr,$needle); echo"<br>"; echomidSearch($arr,0,count($arr)-1,$needle);
3.写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数
/** *Description:获取中枢点的位置 * *@paramarray$array *@paramint$left *@paramint$right *@paramstring$field *@returnint */ functionfetchArrayPivot(&$array,$left,$right,$field) { //基准定义 $stand=$array[$left]; //遍历数组 while($left<$right){ while($left<$right&&$array[$right][$field]>=$stand[$field]){ $right--; } if($left<$right){ $array[$left++]=$array[$right]; } while($left<$right&&$array[$left][$field]<=$stand[$field]){ $left++; } if($left<$right){ $array[$right--]=$array[$left]; } } //获取中枢点位置 $array[$left]=$stand; return$left; } /** *Description:快速排序主程序 * *@paramarray$array *@paramint$begin *@paramint$end *@paramstring$field */ functionquickSort(&$array,$begin,$end,$field) { //变量定义 $pivot=null; if($begin<$end){ $pivot=fetchArrayPivot($array,$begin,$end,$field); quickSort($array,$begin,$pivot-1,$field); quickSort($array,$pivot+1,$end,$field); } }
利用快排的思想,增加一个field参数