9.10 美团笔试

1、直接将除法转换为乘法,比较即可(100%)

Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
while(t-->0){
    long n = scanner.nextLong();
    long x = scanner.nextLong();
    long y = scanner.nextLong();
    long k = scanner.nextLong();
    if (k * y < x * (n - k + 1)) {
        System.out.println("Win");
    } else if (k * y == x * (n - k + 1)) {
        System.out.println("Tie");
    } else {
        System.out.println("Lose");
    }
}

2、计算和与0的个数,再判断(100%)

Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int sum = 0;
int zero = 0;
for (int i = 0; i < n; i++) {
    int t = scanner.nextInt();
    sum += t;
    if (t == 0) {
        zero++;
    }
}
sum += zero;
if (sum == 0) {
    System.out.println(zero + 1);
} else {
    System.out.println(zero);
}

3、dfs(82%),动态规划没写出来

求大佬分享动态规划的AC代码

public class Main {
    static int[][] dires = {{2, 0}, {2, 1}};
    static long max = 0;
    static long[] roomValue;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] room = new int[n];
        int[] value = new int[n];
        int maxRoomNum = 0;
        for (int i = 0; i < n; i++) {
            room[i] = scanner.nextInt();
            maxRoomNum = Math.max(room[i], maxRoomNum);
        }
        for (int i = 0; i < n; i++) {
            value[i] = scanner.nextInt();
        }
        for(int i=0;i<n;++i){
            roomValue[room[i]] += value[i];
        }
        dfs(1, maxRoomNum, 0);
        System.out.println(max);
        // dp没写对
//        int[] dp = new int[maxRoomNum * 2 + 2];
//        dp[1] = roomValue[1];
//        max = roomValue[1];
//        for (int i = 1; i < maxRoomNum; i++) {
//            for (int[] d : dires) {
//                int next = i * d[0] + d[1];
//                dp[next] = Math.max(roomValue[next] + dp[i], dp[next]);
//                max = Math.max(dp[next], max);
//            }
//        }
    }

    static void dfs(int start, int maxRoomNum, long val) {
        if (start > maxRoomNum) {
            if (val > max) {
                max = val;
            }
            return;
        }
        for (int[] d : dires) {
            dfs(start * d[0] + d[1], maxRoomNum, val + roomValue[start]);
        }
    }
}

4、0%,求大佬分享思路

5、前缀和 + 贪心(100%)

要使分段最多,每一个位置能分就分,留给后面的数就越多。每个位置从上一个断开的位置开始遍历。

        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        int n = s.length();
        // preSum[i]:s[0:i]的数字和
        int[] preSum = new int[n + 1];
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += s.charAt(i - 1) - '0';
            preSum[i] = sum;
        }
        int ans = 0;
        // 上一段切开的位置
        int last = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = last; j < i; ++j) {
                if ((preSum[i] - preSum[j]) % 7 == 0) {
                    ans++;
                    last = i;
                }
            }
        }
        System.out.println(ans);
#美团笔试##美团##美团笔试题##美团笔试java#
全部评论
感谢大佬第五题思路,很强;第四题我是用bfs,每遍历一次,就添加10的k次方的10个数,然后除以m,遍历过就是移除队列,直到队列中出现0,遍历结束,但只过82%,没有时间看哪出错了。
点赞 回复 分享
发布于 2022-09-11 13:41 广东
第三题,一个地方可以有多个宝藏,考虑了吗
点赞 回复 分享
发布于 2022-09-13 08:23 江苏
请问楼主是什么岗位呢,硬件也要做算法题吗
点赞 回复 分享
发布于 2022-09-14 19:03 北京

相关推荐

11-14 16:13
已编辑
重庆科技大学 测试工程师
Amazarashi66:不进帖子我都知道🐮❤️网什么含金量
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
4 12 评论
分享
牛客网
牛客企业服务