面试题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 }