网易笔试9.12 Java后端岗

四道编程,两道问答,问答不难,阻塞队列;sleep和wait区别,都是经典面试题。
AC了两道,第三第四都没怎么来得及思考。太菜。附一下自己的Java代码,我感觉都是偏暴力的解法:

第一题 找樱桃节点
输入用例:第一行节点数+连接点的枝干数量
10 9
1 left 2
1 right 3
2 left 4
2 right 5
3 right 6
6 left 7
6 right 8
7 left 9
7 right 10
由于这个输入用例很奇怪,之前在leetcode没遇到过,所以卡了很久。后来用了一个二维数组(m+1)*2来保存节点的左右节点信息,因为根节点是1,所以我直接把0行给去了,之后读好读。
两个hashset分别存有子节点的父节点和叶子结点。
最后条件判断筛选父节点就好了。
public class Main {
    public static void main(String[] args) {
        int res =0;
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        //存左右节点信息
        int[][] dict = new int[m+1][2];
        String nullS = sc.nextLine();
        HashSet<Integer> roots = new HashSet<>();
        for(int i  =0;i<n;i++){
            String s = sc.nextLine();
            String[] strs = s.split(" ");
            roots.add(Integer.parseInt(strs[0]));
            if(strs[1].equals("left")){
                dict[Integer.parseInt(strs[0])][0] = Integer.parseInt(strs[2]);
            }
            if(strs[1].equals("right")){
                dict[Integer.parseInt(strs[0])][1] = Integer.parseInt(strs[2]);
            }
        }
        HashSet<Integer> leaf = new HashSet<>();
        for(int i = 1;i<=m;i++){
            for(int j =0;j<2;j++){
                if(dict[i][j] != 0 && !roots.contains(dict[i][j])){
                    leaf.add(dict[i][j]);
                }
            }
        }
        for(int i = 1;i<=m;i++){
            if(roots.contains(i) && leaf.contains(dict[i][0] )&& leaf.contains(dict[i][1])){
                res++;
            }
        }
        System.out.println(res);
    }
}
第二题
最长子序列,条件是a,b,c,x,y,z出现了偶数次(包括0)
public static void main(String[] args) {
        Scanner sc  = new Scanner(System.in);
        String s = sc.nextLine();
        char[] chars = s.toCharArray();
        int len = s.length();
        boolean[][] dict = new boolean[len][len];
        int maxLen = 0;
        for(int i = 0; i<len; i++){
            int a = 0, b =0, c =0,x =0,y=0,z=0;
            int temp = i;
            for(int j = i;j<len;j++) {
                if (chars[j] == 'a') {
                    a++;
                }
                if (chars[j] == 'b') {
                    b++;
                }
                if (chars[j] == 'c') {
                    c++;
                }
                if (chars[j] == 'x') {
                    x++;
                }
                if (chars[j] == 'y') {
                    y++;
                }
                if (chars[j] == 'z') {
                    z++;
                }
                if (a % 2 == 0 && b % 2 == 0 && c % 2 == 0 && x % 2 == 0 && y % 2 == 0 && z % 2 == 0) {
                    dict[i][j] = true;
                    temp = j;
                }
                if (temp - i > 0) {
                    maxLen = Math.max(temp - i + 1, maxLen);
                }
            }
        }
        System.out.println(maxLen);
}
请大佬点评指正!

#笔试题目##网易#
全部评论
看到了大佬第二题用hash的解法,豁然开朗,真是学到了😁
1 回复 分享
发布于 2020-09-12 17:24
我只做出来了第一道和第三道,我把第三道贴出来吧 思路就是:生成一个最小生成树,找出最深的节点。从根到最深都是花费1,其他的节点都是一步花费2。 #include<bits/stdc++.h> using namespace std; int a[1001] = {0}; int main(){ memset(a, -1, 1000); int n, k; cin >> n >> k; int tmp; for(int i = 0; i < n-1;i++){ cin >> tmp; if(tmp > i+1){ a[tmp] = i+1; }else{ a[i+1] = tmp; } } int b[1001] = {0}; for(int i = n-1; i >= 0 ;i--){ b[a[i]] = b[a[i]] > (b[i]+1) ? b[a[i]] : (b[i]+1); } for(int i = 0; i < n ;i++){ cout << b[i] << " "; } if(k <= b[0]){ cout << b[0] + 1; }else{ cout << (k - b[0])/2 + b[0] + 1; } return 0; }
1 回复 分享
发布于 2020-09-12 18:14

相关推荐

不愿透露姓名的神秘牛友
11-03 17:24
宇通 研发岗 年包15.8
点赞 评论 收藏
分享
我也曾抱有希望:说的好直白
点赞 评论 收藏
分享
1 6 评论
分享
牛客网
牛客企业服务