1、题目描述
请实现一个函数,把字符串中的每个空格替换成“%20”。
例如输入“We are happy.”,则输出“We%20are%20happy.”。
2、解题思路
时间复杂度为O(n)
首先遍历一遍字符串,统计出字符串中空格的总数,并且根据空格的总数计算出替换后字符串的新长度。
从字符串的后面开始复制和替换。
准备两个指针,pNew和pOld,pNew指向替换后德字符串的尾部位置,pOld指向原始字符串的尾部位置。
如果pOld指向空格,就分别将‘0’‘2’‘%’(因为指针是从后向前走的)赋给pNew所指向的空间。否则将POld所指向空间的内容赋给PNew所指向空间的内容,两个指针分别朝前移动。
【图源于剑指offer】
3、源码实现
#include<stdio.h>
#include<stack>
#include<iostream>
#pragma warning(disable : 4996)
using namespace std;
void Print(char arr[], int size){
for (size_t i = 0; i < size; ++i){
cout << arr[i];
}
cout << endl;
}
int main(){
char str[] = "hello world!\n";
int count = 0;
int size = 0;//原字符串大小
size = strlen(str);
//遍历字符串,计算有多少个需要替换的空格,并计算出新的字符串大小
for (size_t i = 0; i < size; ++i){
if (str[i] == ' ')
count++;
}
Print(str, size);
int new_size = size + 2 * count;
//采用前后指针,从后向前遍历,遇见空格就替换
char* pOld = &str[size - 1];
char* pNew = &str[new_size - 1];
while (pOld < pNew){
if (*pOld == ' '){
*pNew-- = '0';
*pNew-- = '2';
*pNew-- = '%';
pOld--;
}
*pNew-- = *pOld--;
}
Print(str, new_size);
return 0;
}