整体思路
- 遍历字符串:我们将遍历输入字符串
s中的每个字符。 - 替换字符:当字符是 'a' 时,替换为 "%100",否则保持原字符。
- 使用 StringBuilder:由于字符串在 Java 中是不可变的(immutable),每次修改字符串都会创建一个新的字符串对象,这可能导致性能问题。为了避免这种问题,使用
StringBuilder来高效地构建结果字符串。 - 返回结果:通过
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();
- StringBuilder:
StringBuilder是一个可变的字符序列,它提供了比直接操作字符串更高效的修改和构建字符串的方法。这样可以避免每次修改字符串时都创建新的对象,提高性能。
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":
-
输入字符串:"banana"
-
初始化:
StringBuilder result = new StringBuilder() -
遍历每个字符:
- 第1个字符:
'b'→ 不是 'a',添加'b' - 第2个字符:
'a'→ 是 'a',添加"%100" - 第3个字符:
'n'→ 不是 'a',添加'n' - 第4个字符:
'a'→ 是 'a',添加"%100" - 第5个字符:
'n'→ 不是 'a',添加'n' - 第6个字符:
'a'→ 是 'a',添加"%100"
- 第1个字符:
-
最终结果:
result = "b%100n%100n%100" -
返回结果:将
StringBuilder转换为字符串并返回。
优化和改进
- 该代码已经是一个较为高效的实现,使用了
StringBuilder来避免不必要的字符串创建。 - 可以进一步将
StringBuilder的初始容量设置为输入字符串长度,这样可以减少内存重新分配的次数,但在这种情况下,这种优化影响较小。
复杂度分析
- 时间复杂度:
O(n),其中n是输入字符串的长度。我们需要遍历字符串的每个字符,并根据条件添加字符或替换字符,这个操作的时间复杂度是线性的。 - 空间复杂度:
O(n),我们使用了StringBuilder来存储结果字符串,最坏情况下需要O(n)的空间来存储输出字符串。
总结
这段代码通过使用 StringBuilder 和遍历字符串来高效地完成字符替换操作。它的思路清晰,适合处理字符串中字符替换的需求,并且在性能上也做了优化。