4.9美团笔试情况

5道编程题,ac了4.27
第一题,输入一个n,比如1234,1对应1,看代码中的map,2对应0,最后加起来,题目的意思用int可能会不够,我看可以就没换,很快ac。
         //对于80% 的数据,n<=100000
    //对于20% 的数据,n<=1000000000
    public static void main(String[] args) {
        int[] map = new int[]{1, 0, 0, 0, 0, 0, 1, 0, 2, 1};
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        int res = 0;
        while (x != 0) {
            int y = x % 10;
            res += map[y];
            x /= 10;
        }
        System.out.println(res);
    }    
第二题,经典排序题,给几个人,有身高和名字,身高由低到高,如果身高一样,按姓名字典序排,不知道为什么我用数组自定义排序不给我排正确,最后用了堆才ac。题目看到一半还以为往单调栈方向走,没想到就简单的排序。
public class Solution2 {
    @Test
    public void myTest() {
        System.out.println("beta".compareTo("alpha"));
    }

    //remebor, how to compare tow string
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Person[] p = new Person[n];
        for (int i = 0; i < n; i++) {
            Person person = new Person();
            person.height = sc.nextInt();
            p[i] = person;
        }
        for (int i = 0; i < n; i++) {
            p[i].name = sc.next();
        }
        PriorityQueue<Person> pq = new PriorityQueue<>((a, b) -> (a.height != b.height ? a.height - b.height : a.name.compareTo(b.name)));
//        Arrays.sort(p, (a, b) -> (a != b ? a.height - b.height : b.name.compareTo(a.name)));
        for (int i = 0; i < p.length; i++) {
            pq.add(p[i]);
        }
        for (int i = 0; i < n; i++) {
            System.out.print(pq.poll().name + " ");
        }
    }

    static class Person {
        int height;
        String name;

        public Person() {
        }

        public Person(int height, String name) {
            this.height = height;
            this.name = name;
        }
    }
}

第三题:给你一个图,判断是否u直连v,这个也很简单。
public class Solution3 {
    @Test
    public void myTest() {
    }

    //4 5
    //1 2 1 3 1
    //2 1 3 2 4
    //4
    //1 2
    //2 4
    //2 3
    //1 4
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        int[][] graph = new int[n + 1][n + 1];
        int[] u = new int[m], v = new int[m];
        for (int i = 0; i < m; i++) {
            u[i] = sc.nextInt();
        }
        for (int i = 0; i < m; i++) {
            v[i] = sc.nextInt();
        }
        for (int i = 0; i < m; i++) {
            graph[u[i]][v[i]] = 1;
            graph[v[i]][u[i]] = 1;
        }
        int q = sc.nextInt();
        for (int i = 0; i < q; i++) {
            int x = sc.nextInt(), y = sc.nextInt();
            if (graph[x][y] == 1) System.out.println("Yes");
            else System.out.println("No");
        }
    }
}
第四题,2X2的矩阵,一行一列元素不能一样,问有多少种方法,这个推导一下就出来了,不过我中间出错了一部导致花了很多时间,还好最后ac了。做完这四个还剩下30min。
public class Solution4 {
    @Test
    public void myTest() {
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int n = sc.nextInt();
            if (n < 2) System.out.println(0);
            else if (n == 2) System.out.println(2);
            else if (n == 3) System.out.println((int) ((2 * c(n, 2) + 12 * c(n, 3)) % Math.pow(10, 7)));
            else if (n >= 4) System.out.println((int) ((2 * c(n, 2) + 12 * c(n, 3) + 24 * c(n, 4)) % Math.pow(10, 7)));
        }
    }

    static int[] arr = new int[11];

    private static int c(int n, int k) {
        arr[0] = 1;
        int n_j = 0, k_j = 0, n_K_j = 0;
        if (arr[n] != 0) n_j = arr[n];
        else {
            n_j = fun(n);
            arr[n] = n_j;
        }
        if (arr[k] != 0) k_j = arr[k];
        else {
            k_j = fun(k);
            arr[k] = k_j;
        }
        if (arr[n - k] != 0) n_K_j = arr[n - k];
        else {
            n_K_j = fun(n - k);
            arr[n - k] = n_K_j;
        }
        return n_j / (k_j * n_K_j);
    }

    private static int fun(int x) {
        int res = 1;
        for (int i = 1; i <= x; i++) {
            res *= i;
        }
        return res;
    }

}
第五题,给你两个队列,只能从队列的右边删除,左边插入,问使得c1[1,5,3,4,6]变成目标队列c2[2,1,5,3,4]。这个只过了27%,题看懂了但是没思路,暴力也只能暴力一点点。。。
public class Solution5 {
    //5
    //1 5 3 4 6
    //5
    //2 1 5 3 4
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int[] c1 = new int[n];
            StringBuffer sb1 = new StringBuffer(), sb2 = new StringBuffer();
            for (int i = 0; i < n; i++) {
                c1[i] = sc.nextInt();
                sb1.append(c1[i]);
            }
            int m = sc.nextInt();
            int[] c2 = new int[m];
            for (int i = 0; i < m; i++) {
                c2[i] = sc.nextInt();
                sb2.append(c2[i]);
            }
//        System.out.println(sb1.toString() + "\t" + sb2.toString());
            int i = 0;
//            for (i = 0; i < sb2.length(); i++) {
//                if (sb1.toString().contains(sb2.substring(i, sb2.length()))) {
//                    int len = sb2.length() - i;
//                    System.out.println(sb1.length() + sb2.length() - 2 * len);
//                    break;
//                }
//            }
//            if (i == sb2.length()) {
//                System.out.println(sb1.length() + sb2.length());
//            }
            if (sb2.charAt(sb2.length() - 1) != sb1.charAt(sb1.length() - 1))
                System.out.println(sb1.length() + sb2.length());
            if (sb1.toString().equals(sb2.toString())) System.out.println(0);
            int lcs = fun(sb1.toString(), sb2.toString());
            if (lcs < sb2.length()) System.out.println(sb1.length() + sb2.length());
            System.out.println(sb1.length() + sb2.length() - 2 * lcs);
        }
    }

    //find the lcs
    public static int fun(String s1, String s2) {
        int[][] dp = new int[s1.length() + 1][s2.length() + 1];
        for (int i = 1; i < dp.length; i++) {
            for (int j = 1; j < dp.length; j++) {
                if (s1.charAt(i - 1) == s2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[s1.length()][s2.length()];
    }
}

#美团笔试##笔试题目##美团##实习##Java#
全部评论
最后一道题我也想复杂了,其实就是看原数组以首元素开始(因为删除和插入都有要求,所以只看以首元素开始的,根本不需要dp)和结果数组的最长连续序列;再根据情况判断 如果是0的话,那就双方推倒重来,两个数组和相加即为答案
点赞 回复
分享
发布于 2022-04-09 18:19
一摸一样的分(甚至连dp方程都差不多)
点赞 回复
分享
发布于 2022-04-09 19:08
联想
校招火热招聘中
官网直投
第二题排序好像用compareTo就是不对,应该是比较规则跟题目要求的不对叭 这样写是对的,再构造一个比较器       Arrays.sort(people, new Comparator<People>() {             @Override             public int compare(People p1, People p2) {                 People p = new People();                 if(p1.height != p2.height){                     return p1.height-p2.height;                 }else{                     return p.compare(p1,p2);                 }             }         });      people类里:         @Override         public int compare(People people, People t1) {             String name1 = people.name;             String name2 = t1.name;             int len = name1.length() > name2.length() ? name2.length() : name1.length();             for (int i = 0; i < len; i++) {                 if(name1.charAt(i) == name2.charAt(i)){                     continue;                 }else{                     return name1.charAt(i) - name2.charAt(i);                 }             }             return name1.length() - name2.length();         }     } }
点赞 回复
分享
发布于 2022-04-10 14:23
第四题是怎么推导的请问
点赞 回复
分享
发布于 2022-04-15 12:02

相关推荐

4 10 评论
分享
牛客网
牛客企业服务