一、单选
1.
转换成大写之后,是 new 了一个新的字符串
正确答案:D
2.
B:子类继承父类,重写父类方法
正确答案:C
3.
A:new 出来的对象都是分配在堆上的
正确答案:D
4.
正确答案:C
5.
正确答案:B
6.
正确答案:A
7.
在 new Employee 的时候,需要调用有参的构造函数
又因为是 Person 的子类,所以要先调用父类的构造函数
但是没有用 super,这个是会编译报错的
正确答案:C
8.
无论new 多少个该类的示例,static 方法只有一份,属于类本身
正确答案:F
9.
正确答案:B
10.
在判断相等的时候,进行了自动拆箱
正确答案:B
二、编程
1. 另类加法
解法:
(1)二进制位 异或 的结果,是两个数对应位相加的结果(不考虑进位)
1 = 0001
2 = 0010
1 ^ 2 = 0011
(1)二进制位 与 后 左移一位 的结果,是两个数相加进位后的结果(只考虑进位)
1 = 0001
2 = 0010
(1 ^ 2) << 1 = 0000
因此这道题就循环,两位相加,然后再看 B 是否为 0
代码:
public class UnusualAdd {
public int addAB(int A, int B) {
if(B == 0) {
return A;
}
int sum = 0;
int carray = 0;
while(B != 0) {
sum = A ^ B;
carray = (A & B) << 1;
A = sum;
B = carray;
}
return A;
}
}
2. 走方格的方案数
解法:
1. 使用动态规划
这个和之前写过的不同路径问题很像
不同路径的算法解析
但是这个需要注意一个地方,就是 沿棋盘格之间的边缘线行走
这就需要再初始化的时候,最外边的一行和一列都是 1
代码:
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[][] dp = new int[n+1][m+1];
for(int i = 0; i <= n; i++) {
dp[i][0] = 1;
}
for(int i = 0; i <= m; i++) {
dp[0][i] = 1;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
System.out.println(dp[n][m]);
}
}
2. 递归
这里我们可以分为两种情况
情况一:
如果n或者m为1,则只有一行或者一列,从左上角走到右下角的路径数为n + m
情况二:
如果n,m都大于1,那么走到[n][m]格子的右下角只有两条路径
<1>: 从[n - 1][m]格子的右下角向下走,到达
<2>: 从[n][m - 1]格子的右下角向右走,到达
代码:
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int n = in.nextInt();
int m = in.nextInt();
System.out.println(med(n, m));
}
}
public static int med(int n, int m) {
if(n == 1 && m >= 1 || m == 1 && n >= 1) {
return n + m;
}
return med(n-1, m) + med(n, m-1);
}
}