9月9日奇安信java笔试两道编程题:91 100

第一题最后9%的错误似乎是忘记判断要杀的进程不存在情况,如果不存在则输出0

import java.util.*;

/**
 *
 * 根据pid杀进程,查询杀了多少进程,90%
 * 先用Map<Integer,Set<Integer>>建立一个父进程与子进程的映射,父---一对多--->子,、
 * 注意处理ppid为0,根据题目要求这个表示无父进程
 * 然后用要杀的进程做深度优先,依次杀掉,看函数dfs的实现既可以明白
 * dfs时维护一个Set<Integer> 表示已经杀掉的进程id
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] line1 = in.nextLine().split(" ");
        String[] line2 = in.nextLine().split(" ");
        int killId = in.nextInt();
        int[] pids = new int[line1.length];
        int[] ppids = new int[line2.length];
        for (int i = 0; i < pids.length; i++) {
            pids[i] = Integer.parseInt(line1[i]);
        }
        for (int i = 0; i < ppids.length; i++) {
            ppids[i] = Integer.parseInt(line2[i]);
        }

        Main main = new Main();
        int result = main.getResult(pids, ppids, killId);
        System.out.println(result);
    }

    private int getResult(int[] pid, int[] ppid, int killId) {
        HashMap<Integer, Set<Integer>> map = new HashMap<>();
        for (int i = 0; i < ppid.length; i++) {
            if (ppid[i] == 0) {
                continue;
            } else if (map.containsKey(ppid[i])) {
                map.get(ppid[i]).add(pid[i]);
            } else {
                Set<Integer> tmp = new HashSet<>();
                tmp.add(pid[i]);
                map.put(ppid[i], tmp);
            }
        }
        return dfs(killId, map, new HashSet<>());
    }

    private int dfs(int pid, HashMap<Integer, Set<Integer>> map, Set<Integer> hasKillSet) {
        int result = 1;
        hasKillSet.add(pid);
        if (map.containsKey(pid)) {
            Set<Integer> killLists = map.get(pid);
            for (int id : killLists) {
                if (!hasKillSet.contains(id)) {
                    result += dfs(id, map, hasKillSet);
                }
            }
        }
        return result;
    }
}
import java.util.Scanner;

/**
 * 两个人找他们的共同祖先
 * 100%
 * 不要想的太复杂了,用什么构成二叉树之类的,直接用数组,即使是普通的二叉树都能直接做
 * 首先知道题目的输入是以层次遍历的方式构造二叉树,空节点用-1表示
 * 有个特性一个节点i(i为数组下标+1)的父节点下标为2 * i
 * 两个节点的共同祖先,那么先找到这个两个节点的i(数组下标+1),
 * 不断取最小的那个*2,最后两者相等的那个下标就是父节点小标
 * 同时注意处理一下,边界条件就可以了
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int count = (int) Math.pow(2, n) - 1;
        int[] node = new int[count];

        for (int i = 0; i < count; i++) {
            node[i] = in.nextInt();
        }

        int objOne = in.nextInt();
        int objTwo = in.nextInt();

        Main main = new Main();
        int result = main.getResult(node, objOne, objTwo);
        System.out.println(result);
    }

    private int getResult(int[] node, int objOne, int objTwo) {
        int indexOne = findIndex(node, objOne);
        int indexTwo = findIndex(node, objTwo);
        int indexUseOne = indexOne + 1;
        int indexUseTwo = indexTwo + 1;

        if (indexOne == -1 || indexTwo == -1) {
            return -1;
        } else if (node[indexOne] == -1 || node[indexTwo] == -1) {
            return -1;
        } else {
            while (indexUseOne != indexUseTwo) {
                if (indexUseOne < indexUseTwo) {
                    indexUseTwo = indexUseTwo / 2;
                } else {
                    indexUseOne = indexUseOne / 2;
                }
            }
            return node[indexUseOne - 1];
        }
    }

    private int findIndex(int[] node, int op) {
        for (int i = 0; i < node.length; i++) {
            if (node[i] == op) {
                return i;
            }
        }
        return -1;
    }
}
#奇安信##笔试题目#
全部评论
咋做第二题😂
点赞 回复 分享
发布于 2019-09-09 20:44
第一题要判断不存在才能百分百,第二题来不及写进去😂
点赞 回复 分享
发布于 2019-09-09 20:42
日了...选的python竟然不能用python写编程题...
点赞 回复 分享
发布于 2019-09-09 20:40
求代码
点赞 回复 分享
发布于 2019-09-09 20:39
忘记笔试这个事了,最后十五分钟进去的。。。30,55,估计我是垫底了
点赞 回复 分享
发布于 2019-09-09 20:39
91 100
点赞 回复 分享
发布于 2019-09-09 20:38
91 100
点赞 回复 分享
发布于 2019-09-09 20:38
72 100
点赞 回复 分享
发布于 2019-09-09 20:36

相关推荐

收到了小米的实习offer,犹豫是否要去。。。
认真搞学习:雷总还当过首富呢,公司不算大厂算独角兽吗
点赞 评论 收藏
分享
运营你豪哥:简历改改吧-非本、求职意向技术岗、无实习经历、内容空洞 如果简历不爆改的话,应该是会持续崩溃了 1.把你教育经历放最下面去 2.蓝底照片很奇怪哈,感觉还在高中时代,建议白底重新拍一下 3.校园经历没啥必要,收集和反馈同学们对产品的意见,解决学生和老师之间的沟通,企业招聘不看这些哈 好好思考一下简历的设计和你要表达的重点,再去投简历
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务