这道机试题挺难的
公众号:不安分的猿人
一、金三银四
三四月是每年换工作的黄金时期。但是今年由于疫情的原因,这个时期大家都太难了。面试基本都是电话面试,电话面试完了会有机试(编程题/算法题)。最近我也投了几份简历试了试,确实有点难。本着一个学习的心态,从哪里跌倒就从哪里爬起来。机试的考的是临场发挥,前提是平时要有积累才行。今天分享我前两天的一道机试题,30分的机试我一筹莫展!
二、这道机试题挺难的
2.1 题目
现有一个树控件的数据结构定义如下,认为该数据结构可以直接访问,例如 dataTree.name
[{
"name": "小组1",
"leaf": false, // True 表示叶子节点
"checked": false, // True 表示勾选状态
"children": [
{
"name": "小组2",
"leaf": false,
"checked": false,
"children": [
{
"name": "张三",
"leaf": true,
"checked": false,
"age": 28
},
{
"name": "小组3",
"leaf": false,
"checked": false,
"children": [
{
"name": "李四",
"leaf": true,
"checked": false,
"age": 31
},
... // 可以有任意子节点
]
},
... // 可以有任意子节点
]
}
]
},
{
"name": "小组4",
"leaf": false,
"checked": false,
"children": [
{
"name": "王五",
"leaf": true,
"checked": false,
"age": 35
},
...
]
}, ...]
问题一: 实现一个树控件的勾选事件响应函数,若一个节点下的任意一个叶子节点勾选则该节点与其所有的父节点都被勾选;若勾选的节点含有子节点,则自动勾选所有子节点。
// 勾选事件函数
// dataTreeList 如上所示的树状数据结构
// checkedName 本次事件勾选的节点名称
// isLeaf True 表示本次勾选的节点是叶子节点
// 返回 直接修改dataTree中checked属性
// For Java
void onChecked(List<DataTree> dataTreeList, String checkedName, Boolean isLeaf) {}
问题二: 实现一个函数,求该组织中年龄最大的N个人。(其中保证叶子节点都是人)
// 求最大年龄函数
// dataTreeList 如上所示的树状数据结构
// N N个人的定义,N=[1, 100]
// 返回最大N个人的名字数据,从大到小[name1,name2,…]
String[] getTopN(List<DataTree> dataTreeList, int N) {}
给大家 30
分钟思考时间,不要写出的代码可以执行,整理的思路要正确。
2.2 思路分析
下面是我个人对本题目的分析,如果有讲的不对的地方,欢迎大家指正。下面的代码是通过 Java
语言实现的。
2.2.1 问题一解析
//1.获取所有节点,生成每个节点的父子关系parentId,将树形菜单转为列表(list)
//2.在列表中按照 checkedName 和 isLeaf 树形,匹配对应的节点(atchedChild)
//3.在转化后的所有节点的列表(list)中查找节点(matchedChild)的所有父节点名称,或者查找它的所有子节点名称
//4.通过名称匹配树形菜单的对应节点,设置选中状态
节点对象 Children
代码如下:
public class Children {
//名称
private String name;
//是否叶子节点
private boolean leaf;
//是否选中
private boolean checked;
//年龄
private Integer age;
//父节点id,问题一额外添加的树形
private String