一、题目描述
原文链接:Offer 05. 替换空格
具体描述:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
限制:
- 0 <= s 的长度 <= 10000
二、思路分析
两种方式,第一种就是定义一个存放结果的变量(可以是String,StirngBuffer,StringBuilder),遍历字符串,遇到空格就把%20
拼接进去!
第二种方式就是双指针算法!
- 第一步遍历字符串,求出来需要添加的长度!遇到空格后,存储两个空格在StringBuilder中,
sb.append(" ");
- 第二步定义两个指针,left指向原字符串的最后一个位置,然后把原字符串拼接上sb,right指针指向拼接后的长度 - 1;
- left,right同时向左边移动,同时将left的值放到right上
c_arr[right] = c_arr[left];
- 如果left指针指向的字符是空格,则把
%20
倒序放到right指针指向的地方!就ok啦~
可能第二种方法有点晦涩难懂,简单的说就是计算出最终的长度,然后从后往前存储值!看看代码可能会更好理解一点!
三、AC代码
Stirng方式添加:
class Solution {
public String replaceSpace(String s) {
String result = "";
char[] c_arr = s.toCharArray();
for (int i = 0; i < c_arr.length; i++){
if (" ".equals(c_arr[i] + "") == true){
result += "%20";
}else{
result += c_arr[i];
}
}
return result;
}
}
StringBuffer方式添加:
class Solution {
public String replaceSpace(String s) {
StringBuffer result = new StringBuffer();
char[] c_arr = s.toCharArray();
for (int i = 0; i < c_arr.length; i++){
if (" ".equals(c_arr[i] + "") == true){
result.append("%20");
}else{
result.append(c_arr[i]);
}
}
return result.toString();
}
}
StringBuilder方式添加:
class Solution {
public String replaceSpace(String s) {
StringBuilder result = new StringBuilder();
char[] c_arr = s.toCharArray();
for (int i = 0; i < c_arr.length; i++){
if (" ".equals(c_arr[i] + "") == true){
result.append("%20");
}else{
result.append(c_arr[i]);
}
}
return result.toString();
}
}
双指针做法:
class Solution {
public String replaceSpace(String s) {
if (s == null || s.length() == 0) return s;
// 空格数量 * 2
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++){
if (s.charAt(i) == ' ') sb.append(" ");
}
// 没有空格直接返回
if (sb.length() == 0) return s;
int left = s.length() - 1;// 原字符串最后一个位置
s += sb.toString();
int right = s.length() - 1;// 新字符串最后一个位置
char[] c_arr = s.toCharArray();
while(left >= 0){
if (c_arr[left] == ' '){
c_arr[right--] = '0';
c_arr[right--] = '2';
c_arr[right] = '%';
}else{
c_arr[right] = c_arr[left];
}
right--;
left--;
}
return new String(c_arr);
}
}
四、总结
- 处理字符串速度:String < StringBuffer < StringBuilder,StringBuilder最快
感谢大家的阅读,我是Alson_Code,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿! ❤