题目描述
思路
C++:
在 C++ 语言中, string 被设计成「可变」的类型,因此可以在不新建字符串的情况下实现原地修改。
思路:
(1)1个空格变成%20,长度会增加2.
—所以先统计空格的个数,然后改变string的长度
(2)i指向原字符串末尾,j指向现在字符串的末尾, ij代表原来字符串左边已经没有空格了
—如果s[i]!=’ ’ 那么s[j]=s[i]
—如果s[i]’ ’ 那么将字符串闭区间 [j-2, j] 的元素修改为 “%20”,j=j-2
我第一次知道string居然是可变长度的,原来我的问题就是不知道输入字符串的长度,所以无法确定数组的长度,最后就拿vector实现的,vector实现就类似于java,python,可以不用事先知道长度。思路就很简单了,如果是空格就添加’%20’,不是就添加原字符串就可以了。
源代码
C++
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
string replaceSpace(string s) {
//vector函数就void就行了
vector<char > v;
for (char c : s) {
if (c==' '){
v.push_back('%');
v.push_back('2');
v.push_back('0');
} else{
v.push_back(c);
}
}
for (int i = 0; i <v.size() ; i++) {
cout<<v[i];
}
cout<<endl;
//改变string长度的解决方案:
int count = 0, len = s.size();
// 统计空格数量
for (char c : s) {
if (c == ' ') count++;
}
// 修改 s 长度
s.resize(len + 2 * count);
// 倒序遍历修改
for(int i = len - 1, j = s.size() - 1; i < j; i--, j--) {
if (s[i] != ' ')
s[j] = s[i];
else {
s[j - 2] = '%';
s[j - 1] = '2';
s[j] = '0';
j -= 2;
}
}
return s;
}
};
int main (){
Solution solution;
string s="We are friend!";
string re=solution.replaceSpace(s);
cout<<re<<endl;
return 0;
}
java:
class Solution {
public String replaceSpace(String s) {
StringBuilder res = new StringBuilder();
for(Character c : s.toCharArray())
{
if(c == ' ') res.append("%20");
else res.append(c);
}
return res.toString();
}
}