天天看點

劍指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 }