百度2018春招开发测试工程师编程题题解
Posted wupeixuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了百度2018春招开发测试工程师编程题题解相关的知识,希望对你有一定的参考价值。
题目描述
在一个家庭中,每位成员都有手机。这家户主维护一棵家族树,树的每个节点代表一位家庭成员,每个节点的值代表他她所拥有的手机数量,户主作为这棵树的根。户主想要找到同一代家庭成员所拥有手机的最大数量。属于树中同一级的所有成员都被视为同一代。
编写一个算法,求出同一代家庭成员所拥有手机的最大数量。
输入
函数/方法的输入包含一个参数familyRoot,表示家族树的根。
输出
返回表示同一代家庭成员所拥有手机的最大数量的整数。
限制条件
0 <= N <= 10^5;其中N表示节点数.
0 <= M <= 10^3;其中M表示同一代人所拥有的手机数
请注意
每个节点最多有100个子节点。
示例
输入:
10
/ 11 10
/ \ / 2 3 1 5
输出:21
说期
第1步:第1、2和3级的总和分别是10, 21和11。
第2步:第2级的最大总和是21.因此输出为21。
因此输出为21。
帮助程序说明
以下类用于表示n叉树的一个节点,并已在默认代码中实现(请勿在代码中再次写入此定
义):
class NAryNode
{
int key;
List <NAryNode> child;
public NAryNode(int key)
{
this.key = key;
this.child = new ArrayList<NAryNode>();
}
}
思路
按层次遍历二叉树
访问根节点,并将根节点入队。
当队列不空的时候,重复以下操作。
- 弹出一个元素。作为当前的根节点。
- 如果根节点有孩子,访问孩子节点,并将孩子节点入队。
代码实现
package baidu.demo3;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class Main {
int maxlevelsum(NAryNode pRoot) {
if (pRoot == null) {
return 0;
}
//使用队列,先进先出
Queue<NAryNode> queue = new LinkedList<>();
int max = 0;
int maxSum = 0;
int start = 0;
int end = 1;
queue.add(pRoot);
while (!queue.isEmpty()) {
NAryNode temp = queue.remove();
start++;
//每访问一个节点,就把此节点的孩子节点加入队列,并记录下一层要计算的个数
if (temp.child != null) {
List<NAryNode> list = temp.child;
for (NAryNode n :
list) {
queue.add(n);
}
}
//判断本层是否完成
if (start == end) {
//此时的queue中存储的都是下一层的节点,则end即为queue大小
end = queue.size();
start = 0;
if (maxSum < max) {
maxSum = max;
}
max = 0;
}
}
return maxSum;
}
}
以上是关于百度2018春招开发测试工程师编程题题解的主要内容,如果未能解决你的问题,请参考以下文章