剑指Offer_5_替换空格

时间:2024-11-26 20:33:07

题目描述

请实现一个函数,将一个字符串中的空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为 We%20Are%20Happy。
   在网络编程中,如果一个URL参数含有特殊字符,如空格,#等,可能导致服务端无法获得准确的参数值。我们需要将这些特殊字符转换成服务端可以识别的字符,转换的规则是在'%'后面跟上ASCII码的两位十六进制表示。比如空格的ASCII码是32,也就是十六进制的0x20,因此空格被替换为了%20 。再比如#的ASCII码为35,即0x23,因此他在URL中应替换为%23 。(URL相关的可以参考我Java爬虫的那几篇) 
   将一个空格替换为三个字符 。
   如果按顺序遍历字符串,在保证字符串有足够的空间下,需要对后边的字符串进行大量的移动。 
   较为简单的方法是,遍历一边字符串,记录空格数,假如为字符串原长度为10,空格数为3 , 那么替换后字符串的长度应该为 10+2*3 。
   然后倒序操作字符串,遇到非空格的字符串,则填到扩展位,然后扩展位减一,遇到空格,则在扩展位位置填入'0' ,'2' ,'%' ,每次扩展位各加一 。
 #include<bits/stdc++.h>

 using namespace std ;

 int main()
{
char c[] = "We are Happy" ;
int len = ;
int num = ; // 空格数
for(int i=;i<len;i++){
if(c[i]==0x20){
num ++ ;
}
} int newLen = len + * num ; // 替换后字符串应该的长度
char *a = new char[newLen];
for(int i=len-;i>=;i--){
if(c[i]!=0x20){
a[newLen--] = c[i] ;
}else {
a[newLen--] = '';
a[newLen--] = '';
a[newLen--] = '%';
}
}
cout << a <<endl ;
return ;
}