(1)
思路
题目要求,按照字母顺序在给定的字符串s进行查找,每次操作按顺序删除字符 'a' 到 'z' 的最早出现位置,直到字符串为空。要求返回最后一次操作前的字符串状态。
要找到最后一次操作前的字符串状态,也就是找到字符串里存在最多的字母,并按照他们在字符串里的相对位置输出。
统计字符出现次数和最后位置:
- 使用数组
cnt
统计每个字符出现的次数 - 使用数组
last
记录每个字符最后一次出现的位置
确定最大操作次数:
- 找到出现次数最多的字符,其出现次数
mx
即为最大操作次数 - 所有出现次数等于
mx
的字符,都会在最后一次操作中被删除
构建结果字符串:
- 收集所有出现次数等于
mx
的字符的最后出现位置 - 按位置排序后拼接这些字符,得到最后一次操作前的字符串
代码
java
class Solution {
public String lastNonEmptyString(String S) {
int[] cnt = new int[26]; // 存储每个字符的出现次数
int[] last = new int[26]; // 存储每个字符最后一次出现的索引
char[] s = S.toCharArray(); // 转换为字符数组以便处理
// 遍历字符串,统计每个字符的出现次数和最后出现位置
for (int i = 0; i < s.length; i++) {
int b = s[i] - 'a'; // 将字符转换为0-25的索引
cnt[b]++; // 对应字符计数加1
last[b] = i; // 更新该字符最后出现的索引
}
// 找到最大的出现次数
int mx = Arrays.stream(cnt).max().getAsInt();
// 收集所有出现次数等于最大次数的字符的最后出现索引
List<Integer> ids = new ArrayList<>();
for (int i = 0; i < 26; i++) {
if (cnt[i] == mx) {
ids.add(last[i]); // 只添加出现次数最多的字符的最后索引
}
}
// 对这些索引进行排序(按出现位置从小到大)
Collections.sort(ids);
// 根据排序后的索引构建结果字符串
StringBuilder t = new StringBuilder(ids.size());
for (int i : ids) {
t.append(s[i]); // 按排序后的索引顺序添加字符
}
return t.toString(); // 返回构建好的字符串
}
}
- StringBuilder 可变字符串;
- toCharArray()用于将字符串转换为一个字符数组(
char[]
); - int b = s[i] - 'a'; 对应的ASCII码减去a的ASCII码,获得相对位置;
- int mx=Arrays.stream(cnt).max().getAsInt();用于查找数组中的最大值,等价于:
java
int mx = Integer.MIN_VALUE;
for (int num : cnt) {
if (num > mx) {
mx = num;
}
}
分步解释
-
Arrays.stream(cnt)
- 将数组
cnt
转换为一个流(Stream) Arrays.stream(int[] array)
是 Arrays 类的静态方法,返回一个 IntStream(元素类型为 int 的流)
- 将数组
-
.max()
- 在流中查找最大值
- 返回一个
OptionalInt
对象(因为流可能为空,所以使用 Optional 包装) - OptionalInt 是一个容器对象,可能包含也可能不包含一个 int 值
-
.getAsInt()
- 从 OptionalInt 中获取值
- 如果流不为空,返回流中的最大值
- 如果流为空,会抛出 NoSuchElementException(但在这个上下文中不会发生,因为 cnt 数组长度固定为 26)
解释
java
int[] cnt = new int[26];
int[] last = new int[26];
char[] s = S.toCharArray();
for (int i = 0; i < s.length; i++) {
int b = s[i] - 'a';
cnt[b]++;
last[b] = i;
}
- 遍历字符串,统计每个字符的出现次数和最后出现位置
java
int mx = Arrays.stream(cnt).max().getAsInt();
for (int i = 0; i < 26; i++) {
if (cnt[i] == mx) {
ids.add(last[i]);
}
}
- 找到最大出现次数
mx
- 收集所有出现次数等于
mx
的字符的最后出现位置
java
Collections.sort(ids);
StringBuilder t = new StringBuilder(ids.size());
for (int i : ids) {
t.append(s[i]);
}
return t.toString();
- 按位置排序后拼接这些字符,得到最终结果
(2)
HttpServletRequest是用于获取HTTP请求信息的接口,而C选项"设定响应的content类型"属于响应相关的功能,这是HttpServletResponse接口的职责,而不是HttpServletRequest的功能。
分析其他选项:
A正确:HttpServletRequest提供了getCookies()方法来读取请求中的cookie信息。
B正确:HttpServletRequest提供了getHeader()等方法来读取HTTP请求头信息。
D正确:HttpServletRequest提供了getRequestURI()、getContextPath()等方法来读取请求的路径信息。
这体现了Servlet API设计中的职责分离原则:
-
HttpServletRequest专注于获取请求相关的信息
-
HttpServletResponse专注于设置响应相关的信息
(3)
1. 初始化父类中的静态成员变量和静态代码块 ;
2. 初始化子类中的静态成员变量和静态代码块 ;
3.初始化父类的普通成员变量和代码块,再执行父类的构造方法;
4.初始化子类的普通成员变量和代码块,再执行子类的构造方法;
执行过程:
-
当执行new Z()时,会先调用父类X的构造方法
-
在调用X的构造方法之前,会先初始化X类中的成员变量,即X类中的y = new Y(),这会打印Y
-
然后执行X类的构造方法,打印X
-
接着初始化Z类中的成员变量,即Z类中的y = new Y(),这会打印Y
-
最后执行Z类的构造方法,打印Z
因此最终的输出顺序是:YXYZ
(4)

-
A.String.join()
• 正确。String.join()是Java 8引入的方法,支持通过分隔符合并多个字符串(包括两个)。例如:String result = String.join("", str1, str2); // 无分隔符合并
• 特点:简洁但需指定分隔符(即使为空)。
-
B.String.concat()
• 正确。String类的concat()方法直接追加字符串:String result = str1.concat(str2); // 直接合并
• 特点:简单但效率低,频繁使用会导致大量临时对象。
-
C.StringBuilder.append()
• 正确。StringBuilder通过append()高效拼接:StringBuilder sb = new StringBuilder(); sb.append(str1).append(str2); String result = sb.toString();
• 特点:性能最优,适合高频拼接场景。
-
D.StringBuffer.insert()
• 正确。StringBuffer的insert()方法可在指定位置插入字符串:StringBuffer sb = new StringBuffer(str1); sb.insert(str1.length(), str2); // 在末尾插入
• 特点:线程安全但性能略低于StringBuilder。
(5)
A正确:准确描述了Java异常的继承层次。Throwable是所有异常的基类,下面分为Error和Exception两大类,而Exception又包括RuntimeException、IOException等子类。
B正确:非RuntimeException通常称为受检异常(checked exception),代表程序外部的错误状况,比如文件读写、网络连接等。这类异常必须显式处理,要么使用try-catch捕获,要么在方法签名中用throws声明。
C正确:Error表示系统级的错误和资源耗尽的情况,如StackOverflowError、OutOfMemoryError等。这类错误一般是不可恢复的,因此不需要也不应该捕获。
D错误:RuntimeException(运行时异常)属于非受检异常(unchecked exception),虽然可以捕获,但不强制要求必须捕获。这类异常通常由程序错误导致,如数组越界(ArrayIndexOutOfBoundsException)、空指针(NullPointerException)等,应该通过程序逻辑来预防,而不是依赖异常处理机制。