剑指Offer_5_替换空格

题目描述

请实现一个函数,将一个字符串中的空格替换成“%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' ,'%' ,每次扩展位各加一 。
 
 1 #include<bits/stdc++.h>
 2 
 3 using namespace std ;
 4 
 5 int main()
 6 {
 7     char c[] = "We are Happy" ;
 8     int len = 13 ;
 9     int num = 0 ; // 空格数
10     for(int i=0;i<len;i++){
11         if(c[i]==0x20){
12             num ++ ;
13         }
14     }
15 
16     int newLen = len + 2 * num ; // 替换后字符串应该的长度
17     char *a = new char[newLen]; 
18     for(int i=len-1;i>=0;i--){
19         if(c[i]!=0x20){
20             a[newLen--] = c[i] ;
21         }else {
22             a[newLen--] = '0';
23             a[newLen--] = '2';
24             a[newLen--] = '%';
25         }
26     }
27     cout << a <<endl ;
28     return 0 ;
29 }

 

 
 
 
     
posted @ 2017-12-04 14:09  AntzUhl  阅读(165)  评论(0编辑  收藏  举报