java错题

(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(); // 返回构建好的字符串
    }
}
  1. StringBuilder 可变字符串;
  2. toCharArray()用于将字符串转换为一个字符数组(char[]);
  3. int b = s[i] - 'a'; 对应的ASCII码减去a的ASCII码,获得相对位置;
  4. int mx=Arrays.stream(cnt).max().getAsInt();用于查找数组中的最大值,等价于:
java 复制代码
int mx = Integer.MIN_VALUE;
for (int num : cnt) {
    if (num > mx) {
        mx = num;
    }
}

分步解释

  1. Arrays.stream(cnt)

    • 将数组 cnt 转换为一个流(Stream)
    • Arrays.stream(int[] array) 是 Arrays 类的静态方法,返回一个 IntStream(元素类型为 int 的流)
  2. .max()

    • 在流中查找最大值
    • 返回一个 OptionalInt 对象(因为流可能为空,所以使用 Optional 包装)
    • OptionalInt 是一个容器对象,可能包含也可能不包含一个 int 值
  3. .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.初始化子类的普通成员变量和代码块,再执行子类的构造方法;

执行过程:

  1. 当执行new Z()时,会先调用父类X的构造方法

  2. 在调用X的构造方法之前,会先初始化X类中的成员变量,即X类中的y = new Y(),这会打印Y

  3. 然后执行X类的构造方法,打印X

  4. 接着初始化Z类中的成员变量,即Z类中的y = new Y(),这会打印Y

  5. 最后执行Z类的构造方法,打印Z

因此最终的输出顺序是:YXYZ

(4)

  1. A.String.join()
    • 正确。String.join()是Java 8引入的方法,支持通过分隔符合并多个字符串(包括两个)。例如:

    复制代码
      String result = String.join("", str1, str2);  // 无分隔符合并

    • 特点:简洁但需指定分隔符(即使为空)。

  2. B.String.concat()
    • 正确。String类的concat()方法直接追加字符串:

    复制代码
      String result = str1.concat(str2);  // 直接合并

    • 特点:简单但效率低,频繁使用会导致大量临时对象。

  3. C.StringBuilder.append()
    • 正确。StringBuilder通过append()高效拼接:

    复制代码
      StringBuilder sb = new StringBuilder();
      sb.append(str1).append(str2);
      String result = sb.toString();

    • 特点:性能最优,适合高频拼接场景。

  4. 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)等,应该通过程序逻辑来预防,而不是依赖异常处理机制。

相关推荐
水花花花花花3 分钟前
线性代数基础
线性代数·算法·机器学习
zeijiershuai9 分钟前
Mybatis-入门程序、 数据库连接池、XML映射配置文件、MybatisX
xml·java·开发语言·mybatis
codists11 分钟前
《算法导论(第4版)》阅读笔记:p115-p126
算法
java122422 分钟前
== 和 equals 的区别
java
是三好22 分钟前
Lock锁
java·juc
小手WA凉23 分钟前
Gradle快速入门
java·spring·gradle
远瞻。34 分钟前
【论文精读】2022 CVPR--RealBasicVSR现实世界视频超分辨率(RealWorld VSR)
论文阅读·算法·超分辨率重建
Kent_J_Truman43 分钟前
【羊圈——状压 + DP / 记忆化搜索DP】
算法
搞不懂语言的程序员1 小时前
Elasticsearch简单集成java框架方式。
java·大数据·elasticsearch
<但凡.1 小时前
题海拾贝:P1784 数独
算法·深度优先·图论