思路:

例如把we are happy这个字符串中所有空格替换成"%20",最直接的做法是从头开始扫苗,遇到空格就替换,并且把空格后面的字符都顺序后移。复杂度O(n^2)。

重要思想(这个从后往前的思想特别重要,举一反三的例子也是):先扫描一遍字符串统计出空格数量blanknum,由于每个空格被替换成3个字符"%20",即每替换一个空格总长度增加2,因此最后总的长度应该是原长+blanknum*2。然后对字符串从后往前扫描,不是空格的直接移动到新位置,如果是空格替换成%20。

 1 #include <iostream>
 2 #include <string>
 3 #define maxlen 100
 4 using namespace std;
 5 
 6 void ReplaceBlank(char strarr[], int length) //length是string总容量
 7 {
 8     int oldlength,newlength,blanknum;
 9     if(strarr == NULL && length <= 0) return; //先检查参数合法
10     int i=0;
11     blanknum=0;
12     oldlength = strlen(strarr)+1;
13  /*   while(strarr[i] != '\0')       
14     {
15        // cout<<"b";
16         if(strarr[i] == ' ')
17         {
18          blanknum++;
19          i++;
20         }
21     }*/
22     for(int i=0; i<oldlength; i++)
23     {
24         if(strarr[i] == ' ')
25         {
26             blanknum++;
27         }
28     }
29     newlength = oldlength + blanknum*2;
30     if(newlength > length) return; //随时注意检查合法性
31     int indexOfOld = oldlength;
32     int indexOfNew = newlength;
33     while(indexOfOld >= 0)
34     {
35         if(strarr[indexOfOld] != ' ')
36         {
37             strarr[indexOfNew] = strarr[indexOfOld];
38             indexOfNew--;
39             indexOfOld--;
40         }
41         else
42         {
43             strarr[indexOfNew] = '0';
44             strarr[--indexOfNew] = '2';
45             strarr[--indexOfNew] = '%';
46             indexOfNew--;
47             indexOfOld--;
48         }
49     }
50 }
51 
52 
53 int main()
54 {
55     char strarr[maxlen];
56     cout<<"Input a string:";
57     gets(strarr);
58     puts(strarr);
59     ReplaceBlank(strarr,maxlen);
60     puts(strarr);
61     return 0;
62 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-10-22
  • 2022-12-23
  • 2021-05-18
  • 2022-01-02
  • 2021-12-21
  • 2021-09-28
猜你喜欢
  • 2022-12-23
  • 2022-01-07
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-29
  • 2021-04-14
相关资源
相似解决方案