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

相关推荐

2025-12-27 16:01
重庆大学 Java
蛊界Go学长林剑行:项目部分,不光要展示技术栈的熟练程度,还要有架构意识+产品意识。知道每个业务逻辑落地的成果和技术选型的思考,不然纯炫技是没意义的,毕竟你用的这些技术大概率跟大厂实际项目不垂直,面试官不一定有兴趣
简历中的项目经历要怎么写
点赞 评论 收藏
分享
头像
2025-12-14 11:33
门头沟学院 Java
这是一篇迟来的秋招反思总结。虽然可能是拿到了开发的大sp,或者说小ssp的开发offer,但是真正签下三方的那一刻却并没有什么情绪波动,只觉得“这事结束了,我该继续定下下一个阶段的目标了”。回顾一下自己的秋招历程。我的秋招真正的起点可能起源于去年的年中。那时的我可以说对于求职所需的技巧都完全不懂。没有人带,没有带我求职的“导师”,我所做的只能是问几个学长,然后在各种平台找大佬咨询。最后还是选择了资料最多的Java后端开发,从此我的学习便开始了。刷力扣、刷视频、写项目,日复一日,加了知识星球还去打卡,回看当时打卡记录持续了180+天,直到找到了日常实习才结束。不能说是007,但是平均下来也有了995的强度。在年底找到了第一份日常实习,于是踏上了说走就走的旅程。实习的时候每周都要请半天假从公司坐高铁回到学校,开完会再回去,从中午12点到晚上12点全都在路上,这份辛苦只有自己心里清楚。接着开始找暑期实习,先是被腾讯搞了一通,面微信面穿后录用评估挂,接着又是美团全部答上来后超时自动挂,最后在一个普通的下午突然收到了阿里的实习offer。那一刻所有的努力和辛苦都具象化。暑期实习的过程中,运气好进到了一个强度相对比较低的组,于是在7、8月份每天晚上下班后回去继续刷题、复习各技术栈,还要抽时间面试。到了9月初已经面了40+场,进了面的只挂过一次岗位不匹配的腾讯的存储类岗位。9月陆续收到了多个offer,我以为自己也许会算比较优秀?开始谈薪后发现自己其实只是普通的一员,加了各大信息共享群,发现总是有比我更强的人,也有算法的大佬比我断档的领先。至于我为什么没选算法,在之前的文章里有讲到;而开发的大佬则从本科就开始有了相关的沉淀,我自然无法比肩。于是我想到了“比你优秀的人比你还努力”,我有什么可骄傲的。于是开始继续学习,继续成长,这不是抖M式的强迫自己受苦,也不单纯是为了以后的竞争力,还是为了自己的充实感和心理满足。签下三方的时候没有什么情绪波动,只是普通的点了下按钮,然后转头又去继续改bug了。我想我老了也会继续保持学习,让我不被时代抛弃。
NBA球星伦纳德:这段时间看了佬的故事, 也狠狠的激励了我, 保持持续学习的状态
26届校招投递进展
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

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