首页 > 笔经面经 > 2AC+0.8华为笔试4.8

2AC+0.8华为笔试4.8

头像
陈先生1996 #华为笔试#
编辑于 2020-04-08 21:11:17 APP内打开
赞 13 | 收藏 63 | 回复14 | 浏览5982

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

第一题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;
}    

14条回帖

回帖
加载中...
话题 回帖

推荐话题

相关热帖

笔经面经近期热帖

近期精华帖

热门推荐