- 👑专栏内容:力扣刷题
- ⛪个人主页:子夜的星的主页
- 💕座右铭:前路未远,步履不停
目录
- 一、题目描述
- 二、题目分析
- 1、使用`String`内部方法
- 2、使用`StringBuilder`
一、题目描述
题目链接:URL化
编写一种方法,将字符串中的空格全部替换为%20
。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)
二、题目分析
解这道题之前先搞明白题目中说的"真实"长度的意思。
题目说的,“真实长度” 指的是字符串的实际长度,即字符串中包含的有效字符的数量。
与 s.length()
不同,s.length()
是指字符串对象在内存中的长度,而 “真实长度” 是指字符串中实际存储的字符的数量。所以,这道题后面的遍历都需要用到传入的length
而非.length();
1、使用String
内部方法
介绍两个String
的内部方法。
substring(int beginIndex, int endIndex)
这个方法从字符串中提取子串,包括 ·beginIndex· 处的字符,但不包括 endIndex
处的字符。
replaceAll(String regex, String replacement)
这个方法用指定的替换字符串替换字符串中所有匹配给定正则表达式的子字符串。
使用这两个内部方法就可以解决这道题。
class Solution {
public String replaceSpaces(String S, int length) {
String sb = S.substring(0,length);
return S.replaceAll(" ", "%20");
}
}
但是,这样写有几个问题。首先,这样写速度比较慢,其次,这样写会如果题目更改条件可能就没办法用了。因为replaceAll
方法,需要注意正则表达式的特殊字符。如果替换字符串中包含正则表达式的特殊字符,可能会导致错误的结果。下面是需要注意的一些正则表达式特殊字符:
特殊字符 | 描述 |
---|---|
. | 在正则表达式中,表示匹配除换行符 \n 之外的任何字符。可能导致匹配不希望替换的字符。 |
\ | 在正则表达式中,用于转义字符,使其失去特殊意义。如果替换字符串包含反斜杠,可能需要使用两个反斜杠 \\ 进行转义。 |
$ | 在正则表达式中,表示行尾。如果替换字符串包含美元符号,可能导致意外的匹配。 |
* | 在正则表达式中,表示零个或多个前导元素。如果替换字符串包含星号,可能导致意外的匹配。 |
2、使用StringBuilder
先介绍一下StringBuilder
类。StringBuilder
是 Java 中用于处理可变字符串的类,它属于 java.lang
包。与 String
不同,StringBuilder
对象的长度和内容可以修改,适用于需要频繁进行字符串拼接、插入、删除等操作的场景。
StringBuilder
的详细内容:Java8官方文档
介绍一下本题中需要使用的两个方法。
append
方法是 StringBuilder
类的一个重要方法,用于在可变的字符序列(StringBuilder
对象)的末尾追加指定的字符、字符串或其他类型的数据。由于 StringBuilder
是可变的,使用 append 方法可以有效地构建字符串,而不会产生额外的字符串对象,从而提高性能。
StringBuilder sb = new StringBuilder();
// 追加字符串
sb.append("Hello");
// 追加字符
sb.append(' ');
// 追加整数
sb.append(123);
// 追加浮点数
sb.append(3.14);
// 追加换行符
sb.append('\n');
toString
方法是 StringBuilder
类中的一个方法,用于将 StringBuilder
对象的内容转换为一个字符串。因为 StringBuilder
是可变的字符序列,而 String
是不可变的字符序列,toString
方法的调用允许将可变的字符序列转换为不可变的字符串。
以下是 toString
方法的基本形式:
public String toString()
这个方法返回一个包含 StringBuilder
对象中字符序列的新的字符串对象。可以在需要字符串表示形式的地方使用这个方法,比如打印、字符串拼接或其他需要字符串的场合。
下面是一个使用 toString
方法的简单示例:
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
String result = sb.toString();
System.out.println(result);
// 输出:"Hello World"
toString
方法将 StringBuilder
对象 sb
中的字符序列转换为一个新的字符串对象,并赋值给 result
变量。然后,我们打印 result
,输出了拼接后的字符串 “Hello World”。不过需要注意的是,一旦调用了 toString
方法并获得了字符串对象,它就是不可变的了。如果需要进一步修改字符串,你需要创建一个新的可变字符序列。
所以,这道题就可以这样写:
class Solution {
public String replaceSpaces(String S, int length) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i<length; i++){
char ch = S.charAt(i);
if(ch == ' '){
sb.append("%20");
}else{
sb.append(ch);
}
}
return sb.toString();
}
}
注:char ch = S.charAt(i);
作用是获取字符串 i 处的字符。