奇安信集團 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; } }
題目描述: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; } }