2AC+0.8华为笔试4.8

华为今天的题目感觉相比往年偏简单了,三道题前两题直接秒,第三题调试了一小时,交卷后等考试结束发题解🤣感觉这是今年暑期实习最简单的笔试之一

第一题AC

n是底数,L是次数,实际结果就是n的1次+n2+...n的L次
即:L为1那么结果是n,L为2结果是n + n * n...以此类推
难点在于:如果直接计算n的L次,那么不仅int会超出,long尝试后也超出,所以用到快速幂。
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    while (true){
        int n = sc.nextInt();
        int l = sc.nextInt();
        if(n == 0 && l == 0) break;
        long res = 0;
        for (int i = 1; i <= l; i++) {
            res += quickMi(n, i);
        }
        System.out.println(res % 1000000007);
    }
    sc.close();
}

private static long quickMi(long aa, long bb){
    long res = 1;
    long a = aa, b = bb;
    a %= 1000000007;
    for (; b != 0; b /=2) {
        if(b % 2 == 1){
            res = (res * a) % 1000000007;
        }
        a = (a * a) % 1000000007;
    }
    return res;
}

第二题AC

00可以替换为10,10可以替换为01
考虑情况:
  1. 如果是00,直接替换为10;
  2. 如果是11,不做修改;
  3. 如果是10,当前一个数也为0,即010的情况,可以替换为101,否则不做修改;
  4. 如果是01,同第3条。
  5. 这里漏考虑了一些情况,详情请见@KaitoHH的回复
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int t = Integer.valueOf(sc.nextLine());
    for (int x = 0; x < t; x++) {
        int n = Integer.valueOf(sc.nextLine());
        String num = sc.nextLine();
        char[] nums = num.toCharArray();
        for (int i = 0; i <= n - 2; i++) {
            if(nums[i] == '0' && nums[i + 1] == '0'){
                nums[i] = '1';
            }else if(nums[i] == '0' && nums[i + 1] == '1' && i < n - 2 && nums[i + 2] == '0'){
                nums[i] = '1';
                nums[i + 1] = '0';
                nums[i + 2] = '0';
            }
        }
        String res = new String(nums);
        System.out.println(res);
    }
    sc.close();
}

第三题0.8

数独游戏,题目应该指的是肯定有解,那么最简单的就是递归法,这个方法应该是超时,但错误提示是未通过所有用例,改不动了就直接交卷了
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    for (int i = 0; i < 9; i++) {
        String matr = sc.nextLine();
        for (int j = 0; j < 9; j++) {
            nums[i][j] = matr.charAt(2 * j + 1) - '0';    //这里注意要用减0,测试用加0会出问题
        }
    }
    sc.close();
    sudu(0, 0);
}

private static int[][] nums = new int[9][9];

private static void sudu(int i, int j) {
    if(i == 8 && j == 9){
        for (int x = 0; x < 9; x++) {
            System.out.print("{");
            for (int y = 0; y < 8; y++) {
                System.out.print(nums[x][y] + ",");
            }
            if(x < 8) System.out.println(nums[x][8] + "}");
            else System.out.print(nums[x][8] + "}");   //注意最后一行不输出换行
        }
        return;
    }
    if(j == 9){
        i++;
        j = 0;
    }
    if(nums[i][j] == 0){
        for (int k = 0; k <= 9; k++) {
            if(isNine(i, j, k)){
                nums[i][j] = k;                    //依次填数字,然后验证
                sudu(i, j + 1);
                nums[i][j] = 0;                    //如果验证失败,数字重新写回0
            }
        }
    }else sudu(i, j + 1);                          //不是0,即已经填了数字,直接递归
}

private static boolean isNine(int x, int y, int curr) {
    int tempX = x / 3;
    int tempY = y / 3;
    for (int i = 0; i < 3; i++) {                       //检查粗线格子
        for (int j = 0; j < 3; j++) {
            if(nums[tempX * 3 + i][tempY * 3 + j] == curr) return false;
        }
    }
    for (int i = 0; i < 9; i++) {                       //检查行列
        if(nums[x][i] == curr || nums[i][y] == curr) return false;
    }
    return true;
}    
#华为笔试##华为##笔试题目#
全部评论
LZ第二题做的不太对哦。 比如对于 01110 , LZ的输出是01110 但是实际上 01110 -> 01101 -> 01011 -> 00111 -> 10111 因此10111才是最大的。标答估计和LZ犯了同样的错误。
9 回复
分享
发布于 2020-04-08 21:06
第三题就是LeetCode第37题解数独,https://leetcode-cn.com/problems/sudoku-solver/
3 回复
分享
发布于 2020-04-08 21:03
联易融
校招火热招聘中
官网直投
有没有人第三题用DLX写的,我用了一万年的板子,从来没错过,第三题只能90分,严重怀疑他数据有多解或是其他情况;btw,第二题他数据必错(害我找了一个半小时的bug没空改第三题
3 回复
分享
发布于 2020-04-08 21:33
菜鸡不懂为啥要 % 1000000007,求各位大佬解答
1 回复
分享
发布于 2020-04-12 20:11
膜拜大佬,第一题超出范围我实在是没排除bug,自惭形秽啊
点赞 回复
分享
发布于 2020-04-08 21:04
哎第一题快速幂脑子抽了没想到,一直调字符串幂乘+字符串加法,不过后面两题很快AC,提前一小时交卷
点赞 回复
分享
发布于 2020-04-08 21:08
第三题我也是80%,为什么会这样
点赞 回复
分享
发布于 2020-04-08 21:13
诶这第一题我用python不用快速幂100 15的就能过,但是测试用例就有通不过的,再加上第二题怎么也没法AC,感觉数据也有问题。。。哭聊
点赞 回复
分享
发布于 2020-04-08 21:16
2个ac 一个0.9  最后一个提示时间超了,不知道是不是python慢的原因,python是不是不该用递归,该用迭代
点赞 回复
分享
发布于 2020-04-08 21:24
我第一题用python用自带的乘方然后取余,就只通过了20%两个N=1的测试。我佛了,理论上python3的int可以无限长啊,然后取一次余。一直在第一题纠结。
点赞 回复
分享
发布于 2020-04-08 21:29
第一题我用笨方法做的,楼主这快速幂巧妙
点赞 回复
分享
发布于 2020-04-09 09:12
迷惑 楼主大概啥时候投的呀
点赞 回复
分享
发布于 2020-04-09 10:24
楼主有消息了吗
点赞 回复
分享
发布于 2020-04-11 09:13

相关推荐

13 69 评论
分享
牛客网
牛客企业服务