题解-a替换函数| 豆包MarsCode AI刷题

53 阅读4分钟

整体思路

  1. 遍历字符串:我们将遍历输入字符串 s 中的每个字符。
  2. 替换字符:当字符是 'a' 时,替换为 "%100",否则保持原字符。
  3. 使用 StringBuilder:由于字符串在 Java 中是不可变的(immutable),每次修改字符串都会创建一个新的字符串对象,这可能导致性能问题。为了避免这种问题,使用 StringBuilder 来高效地构建结果字符串。
  4. 返回结果:通过 StringBuilder 构建完成后,将其转换成最终的字符串并返回。

代码解析

java
public class Main {
    public static String solution(String s) {
        // 创建一个 StringBuilder 对象来存储结果
        StringBuilder result = new StringBuilder();
        
        // 遍历字符串
        for (int i = 0; i < s.length(); i++) {
            char currentChar = s.charAt(i);
            
            // 检查当前字符是否为 'a'
            if (currentChar == 'a') {
                // 如果是 'a',追加 "%100"
                result.append("%100");
            } 
            else {
                // 否则,直接追加当前字符
                result.append(currentChar);
            }
        }
        
        // 将 StringBuilder 转换为字符串并返回
        return result.toString();
    }

    public static void main(String[] args) {
        System.out.println(solution("abcdwa").equals("%100bcdw%100"));
        System.out.println(solution("banana").equals("b%100n%100n%100"));
        System.out.println(solution("apple").equals("%100pple"));
    }
}

代码详解

1. solution 方法

java
public static String solution(String s) {
    // 创建一个 StringBuilder 对象来存储结果
    StringBuilder result = new StringBuilder();
  • StringBuilderStringBuilder 是一个可变的字符序列,它提供了比直接操作字符串更高效的修改和构建字符串的方法。这样可以避免每次修改字符串时都创建新的对象,提高性能。
java
    // 遍历字符串
    for (int i = 0; i < s.length(); i++) {
        char currentChar = s.charAt(i);
  • 遍历字符串:使用 for 循环逐个访问字符串中的字符。s.length() 返回字符串的长度,s.charAt(i) 获取字符串中索引为 i 的字符。
java
        // 检查当前字符是否为 'a'
        if (currentChar == 'a') {
            // 如果是 'a',追加 "%100"
            result.append("%100");
        } 
        else {
            // 否则,直接追加当前字符
            result.append(currentChar);
        }
  • 检查字符并替换:如果当前字符是 'a',就将 "%100" 追加到 StringBuilder 中。如果当前字符不是 'a',直接将该字符追加到 StringBuilder 中。
java
    }
    
    // 将 StringBuilder 转换为字符串并返回
    return result.toString();
}
  • 最终返回:遍历完成后,使用 toString() 方法将 StringBuilder 中的字符序列转换为字符串并返回。

2. main 方法

java
public static void main(String[] args) {
    System.out.println(solution("abcdwa").equals("%100bcdw%100"));
    System.out.println(solution("banana").equals("b%100n%100n%100"));
    System.out.println(solution("apple").equals("%100pple"));
}
  • 测试用例main 方法中调用了 solution 方法来处理三个示例字符串,并验证返回结果是否符合预期。

    • 第一个测试solution("abcdwa") 应返回 "%100bcdw%100",因为字符串中的两个 'a' 被替换成了 "%100"。
    • 第二个测试solution("banana") 应返回 "b%100n%100n%100",因为字符串中的三个 'a' 被替换成了 "%100"。
    • 第三个测试solution("apple") 应返回 "%100pple",因为字符串中的 'a' 被替换成了 "%100"。

思路图解

让我们通过具体的例子来说明这个过程,假设输入字符串是 "banana"

  1. 输入字符串:"banana"

  2. 初始化StringBuilder result = new StringBuilder()

  3. 遍历每个字符

    • 第1个字符:'b' → 不是 'a',添加 'b'
    • 第2个字符:'a' → 是 'a',添加 "%100"
    • 第3个字符:'n' → 不是 'a',添加 'n'
    • 第4个字符:'a' → 是 'a',添加 "%100"
    • 第5个字符:'n' → 不是 'a',添加 'n'
    • 第6个字符:'a' → 是 'a',添加 "%100"
  4. 最终结果result = "b%100n%100n%100"

  5. 返回结果:将 StringBuilder 转换为字符串并返回。

优化和改进

  • 该代码已经是一个较为高效的实现,使用了 StringBuilder 来避免不必要的字符串创建。
  • 可以进一步将 StringBuilder 的初始容量设置为输入字符串长度,这样可以减少内存重新分配的次数,但在这种情况下,这种优化影响较小。

复杂度分析

  • 时间复杂度O(n),其中 n 是输入字符串的长度。我们需要遍历字符串的每个字符,并根据条件添加字符或替换字符,这个操作的时间复杂度是线性的。
  • 空间复杂度O(n),我们使用了 StringBuilder 来存储结果字符串,最坏情况下需要 O(n) 的空间来存储输出字符串。

总结

这段代码通过使用 StringBuilder 和遍历字符串来高效地完成字符替换操作。它的思路清晰,适合处理字符串中字符替换的需求,并且在性能上也做了优化。