文章目录
一、单选
1.
正确答案:A
2.
正确答案:C
x.append 就变成了 AB
x 修改了引用
y 修改的是对象,对本身并不发生改变
3.
正确答案:B
this. 的是其他的普通方法和成员变量
4.
正确答案:C
没有初始化
5.
正确答案:D
6.
正确答案:C
7.
正确答案:B
8.
正确答案:C
9.
正确答案:B
str 改变的是形参的指向,原来不会改变
ch 修改的是地址,原来会改变
二、不定项选择
1.
正确答案:A,B,D
C:是不可重写
三、编程
1. 统计回文
题解:
遍历 A,将 B insert进入 A 的每个位置,判断是否是回文
这里注意的是,判断回文的时候,直接将字符串逆置,看是否相同就好了
需要注意的是这里不能 A.insert(i, B),这样的话 A 改变了,判断下一个位置就不对了
所以每次使用 A 重新给一个str,然后str.insert(i, B),再判断。
代码:
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String A = sc.nextLine();
String B = sc.nextLine();
int ret = 0;
for(int i = 0; i <= A.length(); i++) {
StringBuilder s = new StringBuilder(A);
s.insert(i,B);
StringBuilder tmp = new StringBuilder(s);
StringBuilder s1 = tmp.reverse();
if(s.toString().equals(s1.toString())) {
ret++;
}
}
System.out.println(ret);
}
}
2. 连续最大和
题目解析:
1. 状态表示:
dp[i] 表示:以 i 位置元素为结尾的所有子数组的最大和
2. 状态转移方程
dp[i] 的所有可能可以分为以下两种:
- 子数组的长度为 1 :此时 dp[i] = nums[i]
- 子数组的长度大于 1 :此时 dp[i] 应该等于以 i - 1 做结尾的「所有子数组」中和的最⼤值再加上 nums[i]
也就是 dp[i - 1] + nums[i]
由于我们要的是「最大值」,因此应该是两种情况下的最大值,因此可得转移方程:
dp[i] = max(nums[i], dp[i - 1] + nums[i])
3. 初始化
可以在最前⾯加上⼀个「辅助结点」,帮助我们初始化
- 辅助结点里面的值要「保证后续填表是正确的」
- 「下标的映射关系」
「最前⾯加上⼀个格子,并且让 dp[0] = 0
4. 填表顺序
从左往右
5. 返回值
返回整个 dp 表中的最大值
代码:
class Solution {
public int maxSubArray(int[] nums) {
int n = nums.length;
int[] dp = new int[n+1];
dp[0] = 0;
int ret = Integer.MIN_VALUE;
for(int i = 1; i <= n; i++) {
dp[i] = Math.max(nums[i-1], dp[i-1] + nums[i-1]);
ret = Math.max(ret,dp[i]);
}
return ret;
}
}