1. 现有下图的树形结构

七. 算法面试题_子节点


该结构存储在数据库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;
}