青训营X豆包MarsCode 技术训练AI刷题a替换函数| 豆包MarsCode AI 刷题

30 阅读5分钟

问题描述

给定一个字符串ss,编写一个函数,将字符串中的小写字母a替换为"%100",并返回替换后的字符串。

例如,对于字符串"abcdwa",所有a字符会被替换为"%100",最终结果为%100bcdw%100"


测试样例

样例1:

输入:s = "abcdwa"
输出:'%100bcdw%100'

样例2:

输入:s = "banana"
输出:'b%100n%100n%100'

样例3:

输入:s = "apple"
输出:'%100pple'

解题思路

数据结构选择

  • 由于字符串在 Java 中是不可变的,直接在原字符串上进行替换操作会比较复杂。因此,我们可以使用 StringBuilder 来构建新的字符串。

算法步骤

  1. 创建一个 StringBuilder 对象,用于存储替换后的字符串。

  2. 遍历输入字符串的每一个字符:

    • 如果当前字符是 'a',则将 "%100" 追加到 StringBuilder 中。
    • 否则,将当前字符追加到 StringBuilder 中。
  3. 遍历结束后,将 StringBuilder 转换为字符串并返回。

代码

public class Main {
    public static String solution(String s) {
        // write code here
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i)=='a'){
                sb.append("%100");
            }else{
                sb.append(s.charAt(i));
            }
        }
        return sb.toString(); // Placeholder
    }

    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. 遍历输入字符串 s 的每一个字符。
  2. 对于每个字符,进行一次条件判断(检查是否为 'a')。
  3. 根据条件判断的结果,将字符或 "%100" 追加到 StringBuilder 中。

具体分析如下:

  • 遍历字符串 s 的时间复杂度是 O(n),其中 n 是字符串的长度。
  • 每次遍历中,条件判断和追加操作的时间复杂度是 O(1)

因此,总的时间复杂度是 O(n)

空间复杂度

  1. StringBuilder 对象,用于存储替换后的字符串。
  2. 输入字符串 s 本身。

具体分析如下:

  • StringBuilder 的空间复杂度取决于最终替换后的字符串长度。在最坏情况下(所有字符都是 'a'),StringBuilder 的长度将是 4 * n(因为每个 'a' 被替换为 "%100")。
  • 输入字符串 s 的空间复杂度是 O(n)

因此,总的空间复杂度是 O(n)

总结

  • 时间复杂度O(n)
  • 空间复杂度O(n)

优化思路

优化思路

1. 减少字符串拼接次数

虽然 StringBuilder 在处理字符串拼接时已经非常高效,但我们可以进一步减少不必要的拼接操作。

2. 使用正则表达式

Java 提供了强大的正则表达式功能,可以简化字符替换操作。

3. 减少不必要的对象创建

在当前代码中,StringBuilder 对象的创建是必要的,但我们可以考虑是否有其他方式来减少对象的创建。

优化方向

1. 使用 replace 方法

Java 的 String 类提供了 replace 方法,可以直接替换字符串中的指定字符。虽然这种方法在内部可能也会使用 StringBuilder,但它可以简化代码。

2. 使用正则表达式

正则表达式可以更灵活地处理字符替换,尤其是在需要替换多个字符时。

其他解答思路

使用字符数组

我们可以将字符串转换为字符数组,直接在数组上进行替换操作,最后再将数组转换回字符串。这种方法可以避免使用 StringBuilder,并且可以更直接地操作字符。

使用递归

我们可以使用递归来处理字符串的替换。递归方法可以让我们更清晰地理解问题的分解和解决过程。

涉及的知识点

 字符串操作

  • 字符串不可变性:在 Java 中,字符串是不可变的,这意味着每次对字符串进行修改时,都会创建一个新的字符串对象。
  • 字符串拼接:使用 StringBuilder 或 String 的 concat 方法进行字符串拼接。
  • 字符串替换:使用 String 的 replace 或 replaceAll 方法进行字符替换。

2. 数据结构

  • StringBuilder:用于高效地构建和修改字符串。
  • 字符数组:将字符串转换为字符数组,直接在数组上进行操作。

3. 算法

  • 线性遍历:通过遍历字符串的每一个字符来进行替换操作。
  • 递归:通过递归方法处理字符串的替换,将问题分解为更小的子问题。

4. 正则表达式

  • 正则表达式:使用正则表达式进行字符替换,提供更灵活的字符处理功能。

5. 时间复杂度和空间复杂度

  • 时间复杂度:分析算法的时间复杂度,确保算法在合理的时间内完成。
  • 空间复杂度:分析算法的空间复杂度,确保算法在合理的内存空间内完成。

6. 字符串与字符数组的转换

  • 字符串转字符数组:使用 toCharArray 方法将字符串转换为字符数组。
  • 字符数组转字符串:使用 new String(char[]) 将字符数组转换为字符串。

7. 递归与迭代

  • 递归:通过递归方法处理问题,将问题分解为更小的子问题。
  • 迭代:通过循环遍历处理问题,逐个处理每个元素。