奇安信集團筆試題:二叉樹的最近公共祖先(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;若是其中一個節點是另外一個節點的祖先,輸出這個祖先點(如例圖中找1五、20最近公共祖先,輸出15);若是輸入無效,輸出-1。 樣例輸入 4 9 6 15 2 -1 12 25 -1 -1 -1 -1 -1 -1 20 37 12 20 樣例輸出 15

 

解題思路:html

從根節點開始遍歷樹。
若是當前節點自己是 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:java

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. 殺死進程

題目描述:web

奇安信集團 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

 

解題思路:編程

http://www.javashuo.com/article/p-ogglvxik-ep.html數組

 

代碼,91%ui

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;
    }
}
相關文章
相關標籤/搜索