1. 程式人生 > 其它 >七. 演算法面試題

七. 演算法面試題

技術標籤:php面試題演算法資料結構

  1. 現有下圖的樹形結構

mark
該結構儲存在資料庫Tree表中,Tree表結構如右圖所示,其中Id為節點編碼,ParentId為父節點編號。
請實現統計給定節點的子節點的數量。例如2的子節點(即節點4,5,6,7)的數量為4,3的子節點數量為0

$arr = [
	['id'=>1,'parent_id'=>0],
	['id'=>2,'parent_id'=>1],
	['id'=>3,'parent_id'=>1],
	['id'=>4,'parent_id'=>2],
	['id'=>5,'parent_id'=>2],
	['id'=>6,'parent_id'=>5],
	['id'=>7,'parent_id'=>5]
];


function subtree($arr,$id=0,$lev=1)
{
    $subs=[];
    foreach($arr as $v){
        if($v['parent_id']==$id){
            $v['lev']=$lev;
            $subs[]=$v;
            $subs = array_merge($subs,subtree($arr,$v['id'],$lev+1));
        }
    }
    return $subs;
}

$res = subtree($arr,2);
var_dump($res);

2.編寫一個函式,在不使用第三方變數的情況下,交換兩個變數的值。兩種情況:(2分)
1.在不使用PHP函式和第三方變數的情況下,交換兩個數字變數的值
2.交換任意型別的兩個變數

int a = 3, b = 4;
a = a+b;
b = a-b;
a = a-b;

3.給定一個數列[1,2,……1000],執行以下計算:擷取前六個數求和並把結果放在數列末尾,直到此數列元素不足6個,求最終數列結果,請編寫php程式碼實現 (3分)

$r = range(1,1000);
// var_dump($r);
for($i=0;$i<199;$i++){
	$sum = 0;
	for($j=0;$j<6;$j++){
		$sum+=$r[0];	
		array_shift($r);
		
	}
	array_push($r,$sum);
}

var_dump($r);

4.有36個運動員,6個跑道,沒計時器。如何用最少的比賽次數算出跑的最快的前3名運動員(思路或者演算法)
應該是8次
(1)首先把36匹馬分為6組,賽6場可以決出每組第一名;
(2)每組第一名在進行一場比賽,得第一名的組,得第二名,得第三名的組繼續,得第四名,第五名,第六名的組都沒必要參賽因為得第四名的組最好的名次就是第四名不可能排進前三了,第五名的組就更沒機會了,所有得到將要進行下一輪比賽的為:
得第一名的組第一名,第二名,第三名,和得第二名的組第一名,第二名(第三名沒有必要因為得第二名的組最好成績是第二名),得第三名的組第一名參賽(總共是6個)剛好賽一場就可以排出前三名;所有總共是6+1+1=8場

5 一群猴子排成一圈,按1,2,…,n依次編號。
然後從第1只開始數,數到第m只,把它踢出圈,
從它後面再開始數,再數到第m只,在把它踢出去…,
如此不停的進行下去,直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。

方法一:遞迴

$array = array(1,2,3,4,5,6,7);
 
function monkeyBigKing($arr,$num,$j=0)
{    
    if(count($arr) <= 1)
    {
        return $arr;
    }
    foreach($arr as $key => $value)
    {    
        $j++;
        if($j%$num == 0)
        {
            unset($arr[$key]);
            $j = 0;
        }
    }
    return monkeyBigKing($arr,$num,$j);
}
$a = monkeyBigKing($array,3);

var_dump($a);

方法二:

$arr = array(1,2,3,4,5,6,7);//示例陣列
echo '<pre>The King is :<br/>';
print_r(king($arr,3));
 
 
function king($arr,$count){
	$i = 1;//從1開始
	while(count($arr) > 1){
		if($i%$count == 0){//用求餘,計算數到的位,如果求餘為0,所數到的位消除,壓出陣列中
			unset($arr[$i-1]);
		}else{//數到的位不是結束,把這一位放到陣列末尾,並消掉這個位
			array_push($arr,$arr[$i-1]);
			unset($arr[$i-1]);
		}
		$i++;//轉移到下一個陣列元素
	}
	return $arr;
}

方法三:

$arr = array(1,2,3,4,5,6,7);//示例陣列
echo '<pre>The King is :<br/>';
print_r(king($arr,3));
 
 
function king($arr,$count){
	$m = count($arr);
	for($i=1;$i<$m;$i++){
		foreach ($arr as $k=>$v) {
			if(($k+1) % $count == 0){
				unset($arr[$k]);
			}else{
				array_push($arr,$arr[$k]);

				unset($arr[$k]);
			}
		}
	}


	return $arr;
}