9.14 华为笔试(华子这次有点狠)

有一说一,华子这次的题真的难!

1、动态规划(100%)

将起点看成0,中间有n块板子,终点为n+1,。有一个初始生命数,有些点的板子是空的,走到上面就会减1条生命。题目求从点0到点n+1的方案数。

public class Main {
    static boolean[] absent;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        int n = scanner.nextInt();
        int k = scanner.nextInt();
        absent = new boolean[n + 2];
        for (int i = 0; i < k; i++) {
            int t = scanner.nextInt();
            absent[t] = true;
        }
        // dp[i][j]:从起点到点i,剩余j条命的走法
        int[][] dp = new int[n + 2][m + 1];
        dp[0][m] = 1;
        // 当前点i
        for (int i = 1; i < n + 2; i++) {
            // 当前点木板缺失,需要在后续的计算中减一条生命值
            int lose = absent[i] ? -1 : 0;
            // 可由前面的点x而来
            for (int x = i - 1; x >= Math.max(i - 3, 0); x--) {
                // 前面点的命
                for (int j = 1; j < m + 1; j++) {
                    dp[i][j + lose] += dp[x][j];
                }
            }
        }
        int ans = 0;
        for (int i = 1; i < m + 1; i++) {
            ans += dp[n + 1][i];
        }
        System.out.println(ans);
    }
}

2、贪心+暴力(100%)

这道题在做的时候贪心可以AC,但可能是测试数据太弱了。评论区有大佬列出了贪心不能过的测试用例,所以这道题用贪心是有问题的

但是我们还是可以学习一下贪心思路,具体可看【LC会议室Ⅱ】这道题,思路几乎一样。n个任务和m个可完成任务的容器,就完成这些任务所需的最小时间。
这道题贪了三个地方:

  1. 数据按照传输时间逆序排序,先处理传输时间最长的;
  2. 在满足传输条件的所有通道里,优先选取最早空闲的(即最早完成自己通道内传输任务的),这样可以最小限度地增加通道的处理时间;
  3. 如果最早空闲时间也相同,就选取传输能力最小的,将能力大的留给后面的任务。
    public class Main2 {
     public static void main(String[] args) {
         Scanner scanner = new Scanner(System.in);
         int m = scanner.nextInt();
         // 通道数
         int n = scanner.nextInt();
         // [通道传输能力][空闲时间]
         int[][] channels = new int[n][2];
         for (int i = 0; i < n; i++) {
             channels[i][0] = scanner.nextInt();
         }
         int[][] data = new int[m][2];
         for (int i = 0; i < m; i++) {
             // 大小
             data[i][0] = scanner.nextInt();
         }
         for (int i = 0; i < m; i++) {
             // 传输时长
             data[i][1] = scanner.nextInt();
         }
         // 按传输时长逆序
         Arrays.sort(data, (a, b) -> {
             if (a[1] == b[1]) {
                 return a[0] - b[0];
             }
             return b[1] - a[1];
         });
         // 贪心1
         for (int[] d : data) {
             int minIdleTime = Integer.MAX_VALUE;
             int ch = 0;
             // 遍历每个通道
             for (int i = 0; i < n; i++) {
                 // 需要满足传输条件
                 if (channels[i][0] >= d[0]) {
                     // 贪心2
                     if (channels[i][1] < minIdleTime) {
                         ch = i;
                         minIdleTime = channels[i][1];
                     } else if (channels[i][1] == minIdleTime && channels[i][0] < channels[ch][0]) {
                         // 贪心3
                         ch = i;
                     }
                 }
             }
             channels[ch][1] += d[1];
         }
         int max = 0;
         for (int i = 0; i < n; i++) {
             max = Math.max(max, channels[i][1]);
         }
         System.out.println(max);
     }
    }

    3、带TTL的最短路径算法(0%,直接不会)

    出一个朴素版的最短路径我都不一定能写出来,结果还带一个额外条件TTL,我还看到了允许的运行时间很苛刻,Java都只有800ms,我都把图建起来了,还是没有写下去的勇气!

考完后我同学说最后输出-1竟然可以过19%,57分啊!(心痛!)

#华为笔试##华为##华为招聘##23届秋招笔面经#
全部评论
第三题print(-1)为菜鸡的我达到100分做出了巨大贡献
63 回复 分享
发布于 2022-09-14 23:08 广东
第二题是npc问题,贪心得不到最优解。 我给一组数据, 5 2 100 100 7 6 4 3 2 7 6 4 3 2 你的程序输出12,最优解应该是11 7+4,6+3+2
12 回复 分享
发布于 2022-09-15 09:01 浙江
第三题建完图 dfs 能过 75%:每走到一个结点,ttl - 1,如果 ttl < 0,则直接 return。
5 回复 分享
发布于 2022-09-14 23:36 江苏
3 回复 分享
发布于 2022-09-15 01:11 四川
cpp选手,第三题用的广搜,过了79%,剩下的没有过的超时。
3 回复 分享
发布于 2022-09-15 21:42 广东
第三题用迪杰斯特拉算法可以算出6,但是我ttl不知道为啥算的不一样,蹲一个大佬教教我www
2 回复 分享
发布于 2022-09-14 23:57 广东
第三题dfs
2 回复 分享
发布于 2022-09-15 00:14 四川
华为第三题我用迪杰斯特拉算法写的,过了57%,没时间找问题了
2 回复 分享
发布于 2022-09-15 09:53 四川
可以到我主页看看我公司,今年互联网情况不好的我觉得是个好的选择
2 回复 分享
发布于 2022-09-15 14:32 北京
厉害厉害
1 回复 分享
发布于 2022-09-15 01:46 广东
有无兄弟第一题15%的,思路一样的还是15%,是有什么特殊的地方没考虑到吗?
1 回复 分享
发布于 2022-09-15 11:09 重庆
华子是多少分过笔试啊
1 回复 分享
发布于 2022-09-15 15:06 四川
第二题不是npc问题吧,可以二分答案然后用网络流判断是否有解,只不过时间复杂度比较高。。。
1 回复 分享
发布于 2022-09-15 15:13 湖南
第三题考虑dp, f[i][j]表示到达i点走了j步的最短路径,然后dp就可以了
1 回复 分享
发布于 2022-09-15 16:40 黑龙江
🐂
1 回复 分享
发布于 2022-09-16 11:31 广东
我昨天的笔试第三天直接cout 《 2通过了15,这样会给分吗
1 回复 分享
发布于 2022-09-17 13:17 江苏
看看得物,前几天刚开,提前投递机会更大!!!https://app.mokahr.com/m/campus_apply/thedu/37483?recommendCode=DScFy1Ng#/jobs
1 回复 分享
发布于 2022-09-18 19:51 广东
原题能发一下吗
点赞 回复 分享
发布于 2022-09-15 09:06 北京
大佬强哇 虽然我已经凉了 但是还是学习学习
点赞 回复 分享
发布于 2022-09-15 10:27 重庆
兄弟,看我主页进群,从此秋招不迷路
点赞 回复 分享
发布于 2022-09-15 15:14 澳大利亚

相关推荐

10-23 21:18
门头沟学院 C++
微风f:gg+1,好难呀
投递华为等公司10个岗位
点赞 评论 收藏
分享
83 422 评论
分享
牛客网
牛客企业服务