一道91%,一道AC,求第一道AC思路

奇安信笔试
第一道 91% 题目要求求进程树,我的思路是用队列存放输入的父节点,a数组放进程,b数组放a的父节点,然后循环遍历b数组。每次遍历b时,如果b中元素==队头元素,a数组中对应元素入队,(结果)sum++;每次遍历完b,出队。
持续上述操作直到队列为空。但是为什么,就是少了9%的数据。
第二道,AC。思路是,不用受题目影响强行用树。用数组保存,然后可以找到输入的数在数组中的下标(为了方便,统一从1开始)。我们可以画一颗树观察一下发现(根节点从下标1开始),每个结点的下标除以2,得到其父节点下标(得到这个就行了)。
大概图是这样(笔试时画的,见谅)

然后我们求输入两个节点在那一层。这种满二叉树很好求层数的。如果不在同一层,层数高的节点,下标不停除以2(相当于不停找父节点)。直到层数一样,观察两个结点下标是否相等,不相等,两个节点再除以2.
#奇安信##笔试题目#
全部评论
第一题91是有可能不存在这个进程,所以需要输出0
点赞 回复 分享
发布于 2019-09-09 20:51
第一题我是用hashmap+递归做的,key存的pid,value存的ppid,每次都遍历了一遍hash表找有没有父进程是上一个子进程的进程。。😂
点赞 回复 分享
发布于 2019-09-09 23:46
第二道题就是最小堆最大堆的数组找父节点的思路。
点赞 回复 分享
发布于 2019-09-09 20:49
package company.qianxin.pro1; import java.util.Scanner; /**  * @author tortoiselala  */ public class Main {     public static void main(String[] args) {         Scanner in = new Scanner(System.in);         String line = in.nextLine();         String[] lineSpiltResult = line.split(" ");         int[] pid = new int[lineSpiltResult.length];         int idx = 0;         for (String e : lineSpiltResult) {             pid[idx++] = Integer.valueOf(e);         }         idx = 0;         line = in.nextLine();         lineSpiltResult = line.split(" ");         int[] ppid = new int[lineSpiltResult.length];         for (String e : lineSpiltResult) {             ppid[idx++] = Integer.valueOf(e);         }         int x = in.nextInt();         System.out.println((isIn(x, pid, ppid) ? 1 : 0) + compute(x, ppid, pid));     }     public static int compute(int x, int[] ppid, int[] pid) {         int re = 0;         for (int i = 0; i < ppid.length; i++) {             if (ppid[i] == x) {                 re += 1 + compute(pid[i], ppid, pid);             }         }         return re;     }     public static boolean isIn(int a, int[] pid, int[] ppid) {         for (int e : pid) {             if (a == e) {                 return true;             }         }         for (int e : ppid) {             if (a == e) {                 return true;             }         }         return false;     } } /* 3 1 5 21 10 0 3 3 1 5 3  */
点赞 回复 分享
发布于 2019-09-09 20:55
进程不存在输出0
点赞 回复 分享
发布于 2019-09-09 20:59
我咋跟你做的不一样。。。
点赞 回复 分享
发布于 2019-09-09 21:19
有代码分享吗?😂
点赞 回复 分享
发布于 2019-09-09 21:37
import java.util.*; public class Main {     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         while (sc.hasNext()) {             int n = sc.nextInt();             int len = (int) (Math.pow(2, n) - 1);             int[] a = new int[len];             for (int i = 0; i < a.length; i++)                 a[i] = sc.nextInt();             int one = sc.nextInt();             int two = sc.nextInt();             int indexOne = -1;             int indexTwo = -1;             for (int i = 0; i < len; i++) {                 if (a[i] == -1)                     continue;                 if (a[i] == one)                     indexOne = i;                 if (a[i] == two)                     indexTwo = i;             }             if (indexOne == -1 || indexTwo == -1)                 System.out.println(-1);             else {                 indexOne = Math.min(indexOne, indexTwo) + 1;                 indexTwo = Math.max(indexOne, indexTwo) + 1;                 int cenOne = 0;                 int cenTwo = 0;                 int temSum = 0;                 for (int i = 0; i < n; i++) {                     int now = (int) Math.pow(2, i);                     if (temSum < indexOne && (temSum + now) >= indexOne)                         cenOne = i + 1;                     if (temSum < indexTwo && (temSum + now) >= indexTwo)                         cenTwo = i + 1;                     temSum += now;                 }                 while (cenOne != cenTwo) {                     cenTwo--;                     indexTwo /= 2;                 }                 while (indexOne != indexTwo) {                     indexOne /= 2;                     indexTwo /= 2;                 }                 System.out.println(a[indexOne - 1]);             }         }     } }
点赞 回复 分享
发布于 2019-09-09 21:45

相关推荐

工作基本定了,比较满意。这深度学习真是难搞啊,论文看不懂,代码看不懂,不会改,创新点???&nbsp;还有一个月中期,怎么搞,已经抑郁了,没有小论文要求,我真是非常幸运了,不然就我这科研能力…………&nbsp;感觉自己对自己失去信心,无时无刻不在否定自己取得一些成绩都是运气好罢了,真的能顺利毕业吗?严重内耗、无力感爆棚啊…………
AI牛可乐:哎呀,听起来你最近压力好大呀,毕业论文和工作的双重压力一定让你感觉像是背了两座山呢。深度学习确实挺复杂的,就像是要在一片迷雾中找到出路一样。但是,你已经很棒了,工作都定好了,这是很大的成就呢! 论文的事情,别太担心。每个人都有看不懂代码和论文的时候,这是正常的。至于创新点嘛,有时候灵感就像小猫一样,需要一点一点地哄出来的。你可以先试试把你看过的资料整理一下,说不定就能找到新的思路呢。 中期答辩前,你可以列个计划,一步一步来,把大问题分解成小问题,一点一点克服。记得,你不是一个人在战斗,你的导师、同学都是你的战友哦。 至于信心嘛,别否定自己,每个人都会有低谷的时候。你已经取得的成绩,都是你实力的体现。毕业不是问题,只要你不放弃,就一定能顺利走过去的。加油哦,我相信你可以的! 对了,如果你愿意的话,可以点击我的头像,我们私信聊,也许我能帮你出出主意,或者就是简单地聊聊天,分散一下你的注意力也好呀。🐮💪🌟
点赞 评论 收藏
分享
10-25 23:12
门头沟学院 Java
点赞 评论 收藏
分享
1 13 评论
分享
牛客网
牛客企业服务