题目描述
请实现一个函数,将一个字符串中的每个空格替换成 “%20”
。例如,当字符串为 We Are Happy.
则经过替换之后的字符串为 We%20Are%20Happy
。
一、解题思路
首先将原字符串转为字符数组,遍历原字符数组,计算出替换之后字符串的长度(因为空格为一个字符,%20为三个字符,所以遇到一个空格就加2个字符),创建新的相同长度字符数组;然后从后往前遍历原字符数组,遇到不是空格的就原封不动填入新字符数组,遇到空格的,就依次从后往前填入字符 ‘0’,‘2’,’%’;直到遍历到原字符数组的第一个字符为止。
二、Java
代码
public class Solution {
public String replaceSpace(StringBuffer str) {
String str1 = str.toString(); //StringBuffer转为字符串
if(str1.equals("")){
return str1;
}
char[] strArray = str1.toCharArray(); //将字符串转换为字符数组
int i = 0;
int spaceNum = 0; //记录空格的数目
for(i = 0; i < strArray.length; i++){
if(strArray[i] == ' '){ //如何遇到空格
spaceNum++; //数目加1
}
}
int newStrLen = strArray.length + spaceNum * 2; //新数组的大小
char[] newStr = new char[newStrLen]; //字符数组
// 从后往前遍历,j为新数组的最后一个元素下标
int j = newStrLen - 1;
//i为原数组最后一个元素的下标
i = strArray.length - 1;
while(i >= 0){
if(strArray[i] != ' '){ //如果不是空格
newStr[j] = strArray[i]; //加填到新字符数组中
i--; //原数组的下标往前移一个
j--; //新数组的下标往前移一个
}else{ //如果遇到空格,依次从后往前填入 0 2 % 三个字符
newStr[j--] = '0';
newStr[j--] = '2';
newStr[j--] = '%';
i--; //原数组的下标往前移动一个
}
}
return new String(newStr);
}
}
或者直接为:
public class Solution {
public String replaceSpace(StringBuffer str) {
if(str == null){
return null;
}
StringBuilder newStr = new StringBuilder();
for(int i=0; i<str.length(); i++){
if(str.charAt(i) == ' '){
newStr.append('%');
newStr.append('2');
newStr.append('0');
}else{
newStr.append(str.charAt(i));
}
}
return newStr.toString();
}
}
三、C++
代码
class Solution {
public:
void replaceSpace(char *str,int length) {
if(str == NULL || length <= 0){
return;
}
int strLen = 0; //记录原字符串长度
int spaceNum = 0; //记录空格数目
int i = 0;
while(str[i] != '\0'){ //遍历字符串
strLen++; //长度+1
if(str[i] == ' '){ //如果遇到空格
spaceNum++; //空格数+1
}
i++;
}
//新字符串长度
int newStrLen = strLen + 2 * spaceNum;
int strIndex = strLen; //原字符串最后一个元素 '\0' 索引
int newStrIndex = newStrLen; //新字符串最后一个元素 '\0' 索引
//开始从后往前遍历
while(strIndex >= 0 && newStrIndex > strIndex){
if(str[strIndex] == ' '){
str[newStrIndex--] = '0';
str[newStrIndex--] = '2';
str[newStrIndex--] = '%';
}
else{
str[newStrIndex--] = str[strIndex];
}
strIndex--;
}
}
};
四、Python3
代码
# -*- coding:utf-8 -*-
class Solution:
# s 源字符串
def replaceSpace(self, s):
# isinstance(s, str):判断一个对象是不是字符串
# 长度是否小于等于0
# 是不是为空
if not isinstance(s, str) or len(s) <= 0 or s == None:
return ''
spaceNum = 0 # 记录空格数目
for i in s:
if i == ' ':
spaceNum += 1
newStrLen = len(s) + spaceNum * 2
newStr = newStrLen*[None] # 创建空数组
strIndex = len(s) - 1 # 原字符串最后一个字符的索引
newStrIndex = newStrLen - 1 # 新字符串最后一个元素的索引
while newStrIndex >= 0 and strIndex <= newStrIndex:
if s[strIndex] == ' ':
newStr[newStrIndex-2:newStrIndex+1] = ['%','2','0']
newStrIndex -= 3
strIndex -= 1
else:
newStr[newStrIndex] = s[strIndex]
newStrIndex -= 1
strIndex -= 1
return ''.join(newStr)