PHP常見算法-面試篇(2)


1.順序查找

思路分析: 從數組的第一個元素開始一個一個向下查找,如果有和目標一致的元素,查找成功;如果到最后一個元素仍沒有目標元素,則查找失敗。

代碼實現

<?php
    function search($arr,$k){
     $n = count($arr);
$arr[$n]= $k; for($i=0; $i<$n; $i++){ if($arr[$i]==$k){ break; } } if ($i<$n){ return $i; }else{ return -1; } }

2.二分查找

思路分析:先取數組中間的值floor((low+top)/2), 然后通過與所需查找的數字進行比較,若比中間值大,則將首值替換為中間位置下一個位置,繼續第一步的操作;若比中間值小,則將尾值替換為中間位置上一個位置,繼續第一步操作 ,重復第二步操作直至找出目標數字。

代碼實現

//    非遞歸
//    $target是要查找的目標 $arr是已經排序好的數組
    function binary(&$arr,$low,$top,$target){
        while($low <= $top){
//由於php取商是有小數的,所以向下取整,不過也可不加,數組也會取整
            $mid = floor(($low+$top)/2);
            echo $mid."<br>";
            if($arr[$mid]==$target){
                return $arr[$mid];
            }elseif($arr[$mid]<$target){
                $low = $mid+1;                
            }else{
                $top = $mid-1;
            }
        }
        return -1;
    }
//    遞歸
    function binaryRecursive($arr,$low,$top,$target){
        if($low<=$top){
            $mid = floor(($low+$top)/2);
            if($arr[$mid]==$target){
                return $arr[$mid];
            }elseif($arr[$mid]<$target){
                return binaryRecursive($arr,$mid+1,$top,$target);
            }else{
                return binaryRecursive($arr,$low,$top-1,$target);
            }
        }else{
            return -1;
        }
    }

3.寫一個二維數組排序算法函數,可以調用php內置函數,能夠具有通用性。

代碼實現

function array_sort($arr, $keys, $order=0) {
    if (!is_array($arr)) {
        return false;
    }
    $keysvalue = array();
    foreach($arr as $key => $val) {
        $keysvalue[$key] = $val[$keys];
    }
    if($order == 0){
        asort($keysvalue);
    }else {
        arsort($keysvalue);
    }
    reset($keysvalue);
    foreach($keysvalue as $key => $vals) {
        $keysort[$key] = $key;
    }
    $new_array = array();
    foreach($keysort as $key => $val) {
        $new_array[$key] = $arr[$val];
    }
    return $new_array;
}

4.寫一個函數,能夠遍歷一個文件下的所有文件和子文件夾

代碼實現

<?php    
    function my_scandir($dir){
        $files = array();
        if($handle = opendir($dir)) {
            while (($file = readdir($handle))!== false) {
                if($file != '..' && $file != '.') {
                    if(is_dir($dir."/".$file)){
                        $files[$file]=my_scandir($dir."/".$file);
                    }else{
                        $files[] = $file;
                    }
                }
            }

            closedir($handle);
            return $files;
        }
    }

5.歸並排序

代碼實現

function Merge(&$arr, $left, $mid, $right) {
  $i = $left;
  $j = $mid + 1;
  $k = 0;
  $temp = array();
  while ($i <= $mid && $j <= $right)
  {
    if ($arr[$i] <= $arr[$j])
      $temp[$k++] = $arr[$i++];
    else
      $temp[$k++] = $arr[$j++];
  }
  while ($i <= $mid)
    $temp[$k++] = $arr[$i++];
  while ($j <= $right)
    $temp[$k++] = $arr[$j++];
  for ($i = $left, $j = 0; $i <= $right; $i++, $j++)
    $arr[$i] = $temp[$j];
}
 
function MergeSort(&$arr, $left, $right)
{
  if ($left < $right)
  {
    $mid = floor(($left + $right) / 2);
    MergeSort($arr, $left, $mid);
    MergeSort($arr, $mid + 1, $right);
    Merge($arr, $left, $mid, $right);
  }
} 

還有部分其他類型的算法面試題參考:

1.http://blog.csdn.net/caleng/article/details/5276403

2.http://www.cnblogs.com/jackluo/p/3139770.html

部分摘自網絡 ,待驗證。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM