奇安信集团笔试题:二叉树的最近公共祖先(leetcode236),杀死进程(leetcode582)
1. 二叉树最近公共祖先
奇安信集团 2020校招 服务端开发-应用开发方向在线考试
编程题|20分2/2
寻祖问宗
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
姓氏是人的符号标志,是家族血脉的传承;族谱是家族血脉传承的文字记载。同姓的两个中国人,根据族谱或许能够查出上面几代内是同一个祖先。查一下族谱,也许当代某位同姓名人就是你的远房亲戚,惊喜不惊喜,意外不意外!!!输入
二元查找树(1.若左子树不空,左子树值都小于父节点;2.如右子树不空,右子树值都大于父节点;3.左、右子树都是二元查找树;4. 没有键值相等的节点)上任意两个节点的值,请找出它们最近的公共祖先。
输入三行行,第一行为树层级,第二行为数节点(其中-1表示为空节点),第三行为需要查找祖先的两个数。
在例图中(虚线框没有真实节点,为了输入方便对应位置输-1)查找12和20的最近公共祖先输入为:
4
9 6 15 2 -1 12 25 -1 -1 -1 -1 -1 -1 20 37
12 20 输出
输出给出两个数在树上的最近公共祖先数值,如果没有公共祖先,输出-1;如果其中一个节点是另一个节点的祖先,输出这个祖先点(如例图中找15、20最近公共祖先,输出15);如果输入无效,输出-1。 样例输入
4
9 6 15 2 -1 12 25 -1 -1 -1 -1 -1 -1 20 37
12 20
样例输出
15
解题思路:
从根节点开始遍历树。
如果当前节点本身是 p 或 q 中的一个,我们会将变量 mid 标记为 true,并继续搜索左右分支中的另一个节点。
如果左分支或右分支中的任何一个返回 true,则表示在下面找到了两个节点中的一个。
如果在遍历的任何点上,左、右或中三个标志中的任意两个变为 true,这意味着我们找到了节点 p 和 q 的最近公共祖先。 作者:LeetCode
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/solution/er-cha-shu-de-zui-jin-gong-gong-zu-xian-by-leetcod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码,全A:
import java.util.LinkedList;
import java.util.Scanner; public class Main{
static class TreeNode{
int value;
TreeNode left;
TreeNode right;
public TreeNode(int value){
this.value = value;
}
}
public static TreeNode root;
public static TreeNode p;
public static TreeNode q;
public static TreeNode commonfather;
public static void main(String[] args) { /***********************层次创建二叉树***********************/
Scanner sc = new Scanner(System.in);
int depth = sc.nextInt();
sc.nextLine();
String[] array1 = sc.nextLine().trim().split(" ");
int pval = sc.nextInt();
int qval = sc.nextInt();
int len = array1.length;
int[] intlevelarray = new int[len];
for (int i = 0; i < len; i++) {
intlevelarray[i] = Integer.valueOf(array1[i]);
}
root = level_buildBTree(intlevelarray,-1,pval,qval);
boolean result = recurseTree(root, p, q);
if(result && commonfather!=null){
System.out.println(commonfather.value);
}else{
System.out.println(-1);
} }
/**层次遍历创建二叉树*/
public static TreeNode level_buildBTree(int[]array,int flag, int pval, int qval){
int len = array.length;
//将数组转成list
LinkedList<TreeNode> list = new LinkedList<>();
for (int i = 0; i < len; i++) {
TreeNode temp = new TreeNode(array[i]);
if(array[i]==pval){
p = temp;
}
if(array[i]==qval){
q = temp;
}
list.add(temp);
}
//开始构建树
for (int i = 0; i < len/2; i++) {
list.get(i).left = list.get(2*i+1).value!=flag?list.get(2*i+1):null;
//记得处理最后一个父节点(len/2-1),因为有可能没有右孩子。
if(i<len/2-1 ||(i==len/2-1&& len%2!=0)){
list.get(i).right = list.get(2*i+2).value!=flag?list.get(2*i+2):null;
}
}
return list.get(0);
} /**
* 二叉树的最近公共祖先
* @param currNode 当前节点
* @param p 第一个孩子
* @param q 第二个孩子
* @return
*/
public static boolean recurseTree(TreeNode currNode, TreeNode p, TreeNode q){
if(currNode == null){
return false;
}
int left = recurseTree(currNode.left, p, q)?1:0;
int right = recurseTree(currNode.right, p, q)?1:0;
int mid = (currNode==p || currNode==q)?1:0;
if(mid+left+right>=2){
commonfather = currNode;
}
return mid+left+right>0;
}
}
2. 杀死进程
题目描述:
奇安信集团 2020校招 服务端开发-应用开发方向在线考试
编程题 | 20.0分1/2
结束进程树
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
给定n个进程,这些进程满足以下条件: (1)每个进程有唯一的PID,其中PID为进程ID (2)每个进程最多只有一个父进程,但可能有多个子进程,用PPID表示父进程ID (3)若一个进程没有父进程,则其PPID为0 (4)PID、PPID都是无符号整数 结束进程树的含义是当结束一个进程时,它的所有子进程也会被结束,包括子进程的子进程。 现在给定大小为n的两组输入列表A和B(1 <= n <= 100),列表A表示进程的PID列表,列表B表示列表A对应的父进程的列表,即PPID列表。 若再给定一个PID,请输出结束该PID的进程树时总共结束的进程数量。 输入
3 1 5 21 10 0 3 3 1 5 5 输出
2 样例输入
3 1 5 21 10
0 3 3 1 5
3 样例输出
5
解题思路:
https://www.cnblogs.com/yoke/p/9770528.html
代码,91%
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner; public class Main3 {
public static int[] pid ;
public static int[] ppid ;
public static void main( String[] args ) {
Scanner sc = new Scanner(System.in);
String[] a = sc.nextLine().trim().split(" ");
String[] b = sc.nextLine().trim().split(" ");
int kill = sc.nextInt();
pid = new int[a.length];
ppid = new int[b.length];
for (int i = 0; i < a.length; i++) {
pid[i]= Integer.valueOf(a[i]);
}
for (int i = 0; i < b.length; i++) {
ppid[i]=Integer.valueOf(b[i]);
}
List<Integer> result = killpid(kill);
if(result!=null){
System.out.println(result.size());
}else{
System.out.println(0);
}
} public static List<Integer> killpid(int kill){
List<Integer> result = new ArrayList<Integer>();
result.add(kill);
for (int i = 0; i < ppid.length; i++) {
if(ppid[i]==kill){
result.addAll(killpid(pid[i]));
}
}
return result;
}
}
奇安信集团笔试题:二叉树的最近公共祖先(leetcode236),杀死进程(leetcode582)的更多相关文章
- Leetcode:面试题68 - II. 二叉树的最近公共祖先
Leetcode:面试题68 - II. 二叉树的最近公共祖先 Leetcode:面试题68 - II. 二叉树的最近公共祖先 Talk is cheap . Show me the code . / ...
- 剑指 Offer 68 - II. 二叉树的最近公共祖先 + 最近公共祖先(LCA)
剑指 Offer 68 - II. 二叉树的最近公共祖先 Offer_68_2 题目详情 题解分析 java代码 package com.walegarrett.offer; /** * @Autho ...
- 编程算法 - 二叉树的最低公共祖先 代码(C)
二叉树的最低公共祖先 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉树的最低公共祖先(lowest common ancestor), 首先先序遍 ...
- Leetcode 236.二叉树的最近公共祖先
二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x ...
- LeetCode236. 二叉树的最近公共祖先
* @lc app=leetcode.cn id=236 lang=cpp * * [236] 二叉树的最近公共祖先 * * https://leetcode-cn.com/problems/ ...
- Java实现 LeetCode 236 二叉树的最近公共祖先
236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x ...
- 剑指 Offer 68 - II. 二叉树的最近公共祖先
剑指 Offer 68 - II. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近 ...
- 面试题68 - II. 二叉树的最近公共祖先
<搜索树结点> <获取路径> 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q ...
- 《剑指offer》面试题68 - II. 二叉树的最近公共祖先
问题描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q ...
随机推荐
- vscode源码分析【八】加载第一个画面
第一篇: vscode源码分析[一]从源码运行vscode 第二篇:vscode源码分析[二]程序的启动逻辑,第一个窗口是如何创建的 第三篇:vscode源码分析[三]程序的启动逻辑,性能问题的追踪 ...
- Python必备收藏!博士大佬总结的Pycharm 常用快捷键思维导图
搜索 Ctrl + Shift + F7用法高亮显示 Ctrl + Alt + F7显示用法 编辑 Ctrl + Shift + V从最近的缓冲区粘贴 Ctrl + D复制选定的区域或行到后面 ...
- Java实现编辑距离算法
Java实现编辑距离算法 编辑距离,又称Levenshtein距离(莱文斯坦距离也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它 ...
- H5双重标题的适配
在QQ和微信中会自代一个标题栏,而手机浏览器没有标题栏. 因此,我自己写了一个标题栏 <div class="headbar"> <center class=&q ...
- Java13 闪亮来袭,你是否还停留在 Java8
近期 Java 界好消息频传.先是 Java 13 发布,接着 Eclipse 也发布了新版本表示支持新版本的 Java 特性. 本文介绍了 Java 13 的新特性并展示了相关的示例. 2019 年 ...
- MySQL基础之STRAIGHT JOIN用法简介
MySQL基础之STRAIGHT JOIN用法简介 引用mysql官方手册的说法: STRAIGHT_JOIN is similar to JOIN, except that the left tab ...
- 获取系统相关信息 (CPU使用率 内存使用率 系统磁盘大小)
引言 在软件开个过程中,对于软件的稳定性和使用率也是我们需要关注的 . 使用sigar来监控,简单方便! 使用说明:下载sigar jar及配合sigar的dll文件来用,需要将dll文件放到JD ...
- oracle查找某个字符在字符串中的个数的技巧
Oracle没有提供查找某个字符在字符串中出现次数的函数,当遇到这样的需求的时候,我们只能使用另外的方法去实现. 简单的思路就是,假设有个字符串str,然后里面有n个[a]字符,当把这n个[a]字符去 ...
- 依赖注入在 dotnet core 中实现与使用:2 使用 Extensions DependencyInjection
既然是依赖注入容器,必然会涉及到服务的注册,获取服务实例,管理作用域,服务注入这四个方面. 服务注册涉及如何将我们的定义的服务注册到容器中.这通常是实际开发中使用容器的第一步,而容器本身通常是由框架来 ...
- jquery 图片缩放插件使用
https://cdn.bootcss.com/d3-transition/1.1.1/d3-transition.js http://www.jq22.com/jquery-info9291