1.替換空格%20
題目:請實現一個函數,把字符串中的每個空格替換成“%20”。例如輸入“We are happy.”,則輸出“We%20are%20happy.”。
1.1分析
將長度為1的空格替換為長度為3的“%20”,字符差的產度變長。如果允許我們開辟一個新的數組來存放替換空格后的字符串,那么這道題目就非常簡 單。設置兩個指針分別指向新舊字符串首元素,遍歷原字符串,如果碰到空格就在新字符串上填入“%20”,否則就復制元字符串上的內容。但是如果面試官要求 在原先的字符串上操作,並且保證原字符串有足夠長的空間來存放替換后的字符串,那么我們就得另想方法。
如果從前往后替換字符串,那么保存在空格后面的字符串肯定會被覆蓋,那么我們就考慮從后往前進行替換。
- 首先遍歷原字符串,找出字符串的長度以及其中的空格數量,
- 根據原字符串的長度和空格的數量我們可以求出最后新字符串的長度。
- 設置兩個指針point1和point2分別指向原字符串和新字符串的末尾位置。
- 如果point1指向內容不為空格,那么將內容賦值給point2指向的位置,如果point1指向為空格,那么從point2開始賦值“02%”
- 直到point1==point2時表明字符串中的所有空格都已經替換完畢。
1.2代碼實例
#include<iostream>
#include<stdio.h>
using namespace std;
//length為字符串總容量
void replacespace(char string[], int length) {
int blanknumber = 0;
int i;
for (i = 0; string[i] != '\0'; i++) {
if (string[i] == ' ') {
blanknumber++;
}
}
int k = i + 2 * blanknumber;
if (k > length)
return;
string[k]='\0';//此行必不可少
int point1 = i - 1, point2 = k-1;
for (; point1 >= 0 && point2 > point1; point1--) {
if (string[point1] == ' ') {
string[point2--] = '0';
string[point2--] = '2';
string[point2--] = '%';
} else
string[point2--] = string[point1];
}
}
int main() {
char *string=new char[50];
while (gets(string)) {
replacespace(string, 50);
puts(string);
}
return 0;
}
2.清除空格
題目:請實現一個函數,把字符串中的每個空格清除掉。例如輸入“We are happy.”,則輸出“Wearehappy.”。
2.1分析
這道題目是需要清楚空格,那么清除空格后所得到的字符串要比原先的字符串要短,這是我們從頭到尾進行清楚空格的話就不會覆蓋到空格后面的字符,所以我們可以從頭開始清除。
- 設定兩個指針p1和p2初始狀態都指向字符串首字符。
- 如果p2指向的元素不為空格,那么將p2指向的內容賦值給p1,然后p1和p2指向下一個元素;如果p2指向的內容為空格,那么p2指向下一個元素。
- 直到p2指向字符串末尾的'\0'時清除空格結束。
#include<iostream> #include<stdlib.h> using namespace std; void ReplaceBlank(char *s) { //設置兩個指針指向數組首元素 char *p1=s; char *p2=s; while('\0'!=*p1) { if(' '!=*p2)//如果p2指向不為空格,則將p2指向內容復制給p1指向 *p1++=*p2++; else//如果p2指向為空格,則p2指針向前移動一格。 p2++; } } void main() { char test[100]="we are happy."; cout<<test<<endl;//we are happy. ReplaceBlank(test); cout<<test<<endl;//we are happy. system("pause"); }
