题目:实现一个函数,把字符串中的每个空格替换成"%20",例如输入"we are happy.",则替换后输出"we%20are%20happy."
方案一:朴素做法是枚举字符串,每次找到一个字符串把当前空格后面的字符串往后移动2个,再把%20插入。这样每次枚举一个字符可能就要移动n个字符,总的n个字符,时间复杂度O(n^2),效率低
方案二:1.先利用O(n)的时间求出字符串中所有的空格的个数,这样就可以求出替换后总的字符串长度
2. 然后从后往前枚举字符,如果不是空格,则依次把字符存放在最终的位置上,遇到空格的时候就填上%20
3. 例如字符串"we are happy.",总的空格数为2,则最后字符串长度为17
从后往前枚举字符串,第一个是y直接填入第17个位置,然后是p,依次.....
直到遇到空格的时候往前填入0、2、%,然后继续枚举字符串
这个方法的时间复杂度O(n),比起朴素算法效率高了很多
#include<iostream> #include<algorithm> using namespace std; void ReplaceBlank(char *string){ //如果是空串直接返回 if(string == NULL){ return; } //求字符串的空格数 int length = strlen(string); int blankCount = 0; for(int i = 0; i < length; i++){ if(string[i] == ' '){ ++blankCount; } } //新的字符串的长度 int newLength = length+2*blankCount; //新的字符串 string[newLength] = '\0'; int pos = newLength-1; for(int i = length-1; i >= 0; i--){ if(string[i] != ' '){ string[pos] = string[i]; --pos; } else{ string[pos--] = '0'; string[pos--] = '2'; string[pos--] = '%'; } } } int main(){ //样例 char string[] = "we are happy."; ReplaceBlank(string); cout<<string<<endl; //输出we%20are%20happy. return 0; }