【18】替换空格

简介: 题目:实现一个函数,把字符串中的每个空格替换成"%20",例如输入"we are happy.",则替换后输出"we%20are%20happy."方案一:朴素做法是枚举字符串,每次找到一个字符串把当前空格后面的字符串往后移动2个,再把%20插入。


题目:实现一个函数,把字符串中的每个空格替换成"%20",例如输入"we are happy.",则替换后输出"we%20are%20happy."


方案一:朴素做法是枚举字符串,每次找到一个字符串把当前空格后面的字符串往后移动2个,再把%20插入。这样每次枚举一个字符可能就要移动n个字符,总的n个字符,时间复杂度O(n^2),效率低


方案二:1.先利用O(n)的时间求出字符串中所有的空格的个数,这样就可以求出替换后总的字符串长度

               2. 然后从后往前枚举字符,如果不是空格,则依次把字符存放在最终的位置上,遇到空格的时候就填上%20

               3. 例如字符串"we are happy.",总的空格数为2,则最后字符串长度为17

                   从后往前枚举字符串,第一个是y直接填入第17个位置,然后是p,依次.....

                   直到遇到空格的时候往前填入0、2、%,然后继续枚举字符串

               这个方法的时间复杂度O(n),比起朴素算法效率高了很多

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

void ReplaceBlank(char *string){
	//如果是空串直接返回
	if(string == NULL){
	   return;
	}
	//求字符串的空格数
	int length = strlen(string);
	int blankCount = 0;
	for(int i = 0; i < length; i++){
		if(string[i] == ' '){
		   ++blankCount;
		}
	}
	//新的字符串的长度
	int newLength = length+2*blankCount;
	//新的字符串
	string[newLength] = '\0';
	int pos = newLength-1;
	for(int i = length-1; i >= 0; i--){
		if(string[i] != ' '){
		   string[pos] = string[i];
		   --pos;
		}
		else{
		   string[pos--] = '0';
		   string[pos--] = '2';
		   string[pos--] = '%';
		}
	}
}

int main(){
    //样例
	char string[] = "we are happy.";
	ReplaceBlank(string);
	cout<<string<<endl; //输出we%20are%20happy.

	return 0;
}


目录
相关文章
|
1月前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
15 0
|
6月前
|
Java C++ Python
leetcode-344:反转字符串
leetcode-344:反转字符串
40 1
剑指offer-4.替换空格
剑指offer-4.替换空格
36 0
|
存储 C++
剑指offer 04. 替换空格
剑指offer 04. 替换空格
69 0
leetcode 344 反转字符串
leetcode 344 反转字符串
81 0
leetcode 344 反转字符串
|
算法 API
LeetCode:剑指Offer 05. 替换空格 (字符串)
题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
LeetCode 344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
58 0
|
算法 Java C++
替换空格(剑指offer 05)
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
108 0