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
考虑情况:
- 如果是00,直接替换为10;
- 如果是11,不做修改;
- 如果是10,当前一个数也为0,即010的情况,可以替换为101,否则不做修改;
- 如果是01,同第3条。
- 这里漏考虑了一些情况,详情请见@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; }