字符串的调整II
题目描述
给定一个字符类型的数组chas[],chas右半区全是空字符,左半区不含有空字符。现在想将左半区的空格字符串替换成“%20”,假设chas右半区足够大,可以满足替换需要的空间,请完成替换函数。
输入描述:
输出一行,代表chas的左半区 ( 1 ≤ l e n g t h ( c h a s l e f t ) ≤ 1 0 5 ) (1 \leq length(chas_{left}) \leq 10^5 ) (1≤length(chasleft)≤105) 。
输出描述:
输出一行,代表替换后的字符串。
示例1
输入
a b c
输出
a%20%20b%20%20%20%20c
备注:
时间复杂度 O ( n ) O(n) O(n),额外空间复杂度 O ( 1 ) O(1) O(1)。
题解:
从前往后遍历,统计空格数目,设为 num ,最终的字符串长度为:len + num * 2。
然后从后往前遍历,遇到非空字符,则直接复制,否则依次填充“0 2 %”。
代码
#include <stdio.h>
const int N = 3e5 + 10;
char s[N];
int main(void) {
gets(s);
int num = 0, i;
int len = 0;
for (i = 0; s[i]; ++i) {
if (s[i] == ' ') ++num;
}
len = i + num * 2 - 1;
s[len + 1] = 0;
while (--i >= 0) {
if (s[i] != ' ') s[len--] = s[i];
else {
s[len--] = '0';
s[len--] = '2';
s[len--] = '%';
}
}
printf("%s\n", s);
return 0;
}