983
技術社區[雲棲]
CareerCup之1.5 空格替換
【題目】
原文:
1.5 Write a method to replace all spaces in a string with ‘%20’.
譯文:
寫一個函數,把字符串中所有的空格替換為%20 。
【分析】
我們首先應該想到的是原來一個空格字符,替換之後變成'%','2','0'三個字符,因此字符串會變長。如果是在原來的字符串上做替換
,那麼我們就有可能覆蓋修改在該字符串後麵的內存。如果是創建信的字符串並在新的字符串上做替換,那麼我們自己可以分配足夠的
內存。由於兩種不同的解決方案,我們應該向麵試官問清楚,讓他們明確告訴我們需求。假設麵試官讓我們在原來的字符串上做替換,
並且保證輸入的字符串後麵有足夠多的空餘內存。
【思路一】
我們最應該想到的方法就是從頭掃描字符串,每一次遇到空格字符的時候就做替換。由於是把一個字符替換成三個字符,我們必須把
空格後麵的所有字符都想後麵移動兩個位置,否則就有兩個字符被覆蓋了。
舉個例子:
我們從頭掃描“ we are happy.”中的每一個空格替換成"%20"。

假設字符串的長度是n。對每一個空格字符,需要移動後麵O(n)個字符,因此含有O(n)個空格字符的字符串而言總的時間複雜度
為O(n^2)。
【思路二】
我們可以先遍曆一遍字符串,這樣我們先統計出空格字符的個數,並由此計算出替換空格字符之後的字符串的總長度。
每替換一個空格,長度增加2,因此替換以後的字符串長度等於原來字符串長度加上2*(空格數目)。
舉個例子:“ we are happy.”
這個字符串的長度為14,裏麵有兩個空格,因此替換之後的字符串長度為18.
我們從字符串的後麵開始複製和替換。首先準備兩個指針p1,p2。p1指向原始字符串的末尾,p2指向替換之後的字符串的末尾。
接下來我們向前移動指針p1,逐個把它指向的字符複製到p2指向的位置,直到碰到第一個空格字符為止。碰到第一個空格之後
把p1向前移動一個位置,在p2之前插入字符串“%20”。由於“%20”的長度為3,同時也要把p2向前移動三個位置。我們接著複製,直到
碰到第二個空格,進行同樣的操作。

【代碼一】
/*********************************
* 日期:2014-05-13
* 作者:SJF0115
* 題目: 替換空格
* 來源:CareerCup
**********************************/
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
//替換空格
char* ReplaceBlank(char* str){
int i;
int len = strlen(str);
if(len <= 0){
return str;
}
//統計空格個數
int count = 0;
for(i = 0;i < len;i++){
if(str[i] == ' '){
count++;
}
}
//p1 指向原始字符串的末尾
int p1 = len;
//p2 指向替換之後的字符串的末尾
int p2 = len + 2*count;
//開辟一個字符串
char *str2 = new char[p2+1];
//替換
while(p1 >= 0){
if(str[p1] == ' '){
p1--;
str2[p2--] = '0';
str2[p2--] = '2';
str2[p2--] = '%';
}
else{
str2[p2--] = str[p1--];
}
}
return str2;
}
int main(){
char* str = "we are happy.";
str = ReplaceBlank(str);
cout<<str<<endl;
return 0;
}
最後更新:2017-04-03 12:56:41