请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “We are happy.”
输出:“We%20are%20happy.”
1、暴力——每检测到一个空格,空格后的数据元素整体后移两位
#include<iostream>
#include<string>
using namespace std;
string ReplaceSpace(string& s) {
int size = s.size();
//统计空格个数
int count = 0;
for (int i = 0; i < size; i++) {
if (s[i] == ' ') {
count++;
}
}
//数组扩容,1个空格替换成3个字符,所以要比原来多两个空格的空间
s.resize(size + count * 2);
int newsize = s.size();
//每后移一轮,最后一个数据的下标也要后移两位,下次后移时的起点j变了
int sum = 0; //统计经过了几轮后移
for (int i = 0; i < newsize; i++) {
if (s[i] == ' ') { //j开始时指向需要后移的数据
for (int j = size - 1 + sum*2; j > i ; j--) {
s[j + 2] = s[j];
}
s[i] = '%';
s[i + 1] = '2';
s[i + 2] = '0';
sum++;
}
}
return s;
}
void PrintString(string s) {
for (int i = 0; i < s.size(); i++) {
cout << s[i];
}
cout << endl;
}
void test() {
string s = "How are you";
ReplaceSpace(s);
PrintString(s);
}
int main() {
test();
}
2、双指针
#include<iostream>
#include<string>
using namespace std;
string ReplaceSpace(string& s) {
// 统计空格的个数
int count = 0;
int size = s.size();
for (int i = 0; i < size; i++) {
if (s[i] == ' ') {
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小
s.resize(size + count * 2);
int newsize = s.size();
// 从后向前将空格替换为"%20"
for (int i = newsize - 1, j = size - 1; j < i; i--, j--) {
if (s[j] != ' ') {
s[i] = s[j];
}
else {
s[i] = '0';
s[i - 1] = '2';
s[i - 2] = '%';
i -= 2;
}
}
return s;
}
void PrintString(string s) {
for (int i = 0; i < s.size(); i++) {
cout << s[i];
}
cout << endl;
}
void test() {
string s = "How are you";
ReplaceSpace(s);
PrintString(s);
}
int main() {
test();
}
不推荐的写法
#include<iostream>
#include<string>
using namespace std;
string ReplaceSpace(string& s) {
int size = s.size();
//统计空格个数
int count = 0;
for (int i = 0; i < size; i++) {
if (s[i] == ' ') {
count++;
}
}
//数组扩容
s.resize(size + count * 2);
int newsize = s.size();
//每后移一轮,最后一个数据的下标也要后移两位,下次后移时的起点j变了
int sum = 1;
for (int i = 0; i < newsize; i++) {
if (s[i] == ' ') { //j开始时指向待赋值的位置
for (int j = size - 1 + sum*2; j > i + 2; j--) {
s[j] = s[j - 2];
}
s[i] = '%';
s[i + 1] = '2';
s[i + 2] = '0';
sum++;
}
}
return s;
}
void PrintString(string s) {
for (int i = 0; i < s.size(); i++) {
cout << s[i];
}
cout << endl;
}
void test() {
string s = "How are you";
ReplaceSpace(s);
PrintString(s);
}
int main() {
test();
}