面试题4:替换空格

题目链接:http://ac.jobdu.com/problem.php?pid=1510

思路:要得到替换后的字符串,显然可以创建一个新的字符串,利用两个指针来来完成操作。假如要求在原字符串上进行替换,

我们只能从后往前遍历原字符串,同时更新得到替换后的字符串。具体方法是,先遍历一遍字符串,记录下有多少个空格,从

而可以计算出替换后的字符串长度(一个空格增加两个字符长度)。利用两个下标,一个初始化原字符串的结尾,一个初始化

为替换后的字符串的结尾。当前者不为空格时,直接复制给后者,然后都向前更新一位。前者为空格时,对应更新后者的三个

字符。当下标相同时,证明空格已经替换完了。

小知识:

在网络编程中,如果URL(统一资源定位器)参数中含有特殊字符,如空格、'#'等,可能导致服务器端无法获取正

确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换规则是在'%'后面跟上ASCII码的两位16进制表示。

注意:

1、利用scanf输入字符串时,会忽略行开头的所有空格字符,并以空格,制表符,换行符作为结束输入标志,换行符残留在缓冲区

2、使用getchar可以读取scanf语句执行后,缓冲区留下的换行符。

3、gets读入以任何字符开始的字符串,以换行符结束,但之后会丢弃换行符并以'\0'代替。

4、c语言里提供了清空缓冲区的函数fflush(stdin).

5、使用格式控制scanf("%[^\n]", string),自己取出缓冲区的残留数据。

code:

 1 #include <cstring>

 2 #include <cstdio>

 3 using namespace std;

 4 const int MAXN = 1000005;

 5 char myStr[MAXN];

 6 int main()

 7 {

 8     while (gets(myStr) != NULL)

 9     {

10         int numOfSp = 0;    // 记录空格数量

11         int len = strlen(myStr);

12         for (int i = 0; i < len; ++i)

13         {

14             if (myStr[i] == 32)

15             {

16                 ++numOfSp;

17             }

18         }

19         int i = len;

20         int j = len + numOfSp * 2;

21         while (i != j)

22         {

23             // 不是空格直接复制

24             if (myStr[i] != 32) myStr[j--] = myStr[i--];

25             // 是空格进行替换

26             else

27             {

28                 myStr[j--] = '0';

29                 myStr[j--] = '2';

30                 myStr[j--] = '%';

31                 i--;

32             }

33         }

34         puts(myStr);

35     }

36     return 0;

37 }

 

你可能感兴趣的:(面试题)