請實現一個函數,將一個字符串中的每一個空格替換成「%20」。例如,當字符串爲We Are Happy.則通過替換以後的字符串爲We%20Are%20Happy。

1、題目描述

請實現一個函數,將一個字符串中的空格替換成「%20」。例如,當字符串爲We Are Happy.則通過替換以後的字符串爲We%20Are%20Happy。ios

2、解題思路

1)簡單暴力解法,咱們能夠很容易的想到,碰到一個空格,就加入%20,因而能夠從頭至尾遍歷字符串,碰到空格,首先將後面的全部字符串日後移動2個字符,這樣才能空出3個字符位子插入字符「%20」,對於一個長度爲n的字符串,對每一個空格,須要移動後面O(n)個字符,所以包含n個空格的字符串,總的時間複雜度爲O(n*n)。這個代碼就不寫了...網絡

2)咱們仔細的思考,難道咱們真的只能0(n*n)的複雜度嗎?不,咱們能夠更快!app

咱們從後往前開始替換,首先遍歷一遍字符串,統計出空格的個數,並由此可以計算出替換以後的字符串的長度。函數

舉個例子:ui

每替換一個空格,長度增長2,所以替換之後字符串的長度等於原來的長度加上2乘以空格數目。以"We are happy"爲例,"We are happy"這個字符串的長度爲14(包括結尾符號"\n"),裏面有兩個空格,所以替換以後字符串的長度是18。spa

接着再次從後往前遍歷字符串,同時設置兩個指針P1和P2,P1指向原始字符串末尾,P2指向替換以後的字符串末尾。咱們向前移動P1,逐個把它指向的字符複製到P2指向的位置,直到碰到第一個空格爲止。而後把P1向前移動一格,在P2以前插入字符串「%20」,同時P2向前移動3格。重複此過程,直到全部的空格都已替換完。這樣只須要掃描一遍,時間複雜度爲O(n)。指針

移動示意圖以下:code

#include <iostream>
#include <iterator>
using namespace std;

void replaceSpace(char* str,int length) {
	char* ots = NULL;
	if (str == NULL && length <= 0) {
		return;
	}
	/*original_length爲字符串str的實際長度*/
	int original_length = 0;			//原始長度
	int number_blank = 0;				//空格數
	int i = 0;
	while (str[i++] != '\0') {				//遍歷字符串
		++original_length;				//長度+1
		if (str[i] == ' ') {
			++number_blank;				//遇到空格+1
		}
	}
	/*new_length爲把空格替換成'%20'以後的長度*/
	int new_length = original_length + 2 * number_blank;
	ots = (char*)malloc(new_length * sizeof(char));
	memset(ots, 0, strlen(ots));
	if (ots == NULL) return;
	memcpy(ots, str, strlen(str));

	int index_original = original_length;	//原始字符串末尾索引值
	int index_new = new_length;				//計算長度後的字符串末尾索引值

	/*index_original指針開始向前移動,若是遇到空格,替換成'%20',不然進行復制操做*/
	while (index_original >= 0 && index_new > index_original) {
		if (ots[index_original] == ' ') {
			ots[index_new--] = '0';
			ots[index_new--] = '2';
			ots[index_new--] = '%';
		}
		else {
			ots[index_new--] = ots[index_original];
		}
		--index_original;
	}

	cout << ots << endl;
};

int main()
{
	const char* tmp = "wu han tai re li";
	char* p = const_cast<char*>(tmp);
	replaceSpace(p, strlen(p));
	return 0;
}

 事實上,不少網絡上的代碼你是絕對編譯不經過的,緣由很簡單,str被從新計算了,而後用新的大小去索引,不崩潰纔怪。blog

相關文章
相關標籤/搜索