• 奇安信集团笔试题:二叉树的最近公共祖先(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;
        }
    }
  • 相关阅读:
    docker基本命令
    vscode 保存提示运行"XXX"的保存参与者: 快速修复
    Vue 2.6 插槽
    代码大全-PartOne-变量命名
    Axure 8.0.1.3388 注册码 授权码 破解
    乱七八糟记一下乱七八糟的碎片化知识
    JavaScript需记的一些细节
    Python3.6问题
    python3.6- shape mismatch: objects cannot be broadcast to a single shape
    Angular+ng-zorro遇坑记
  • 原文地址:https://www.cnblogs.com/haimishasha/p/11494572.html
Copyright © 2020-2023  润新知