ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

剑指offer2:C++实现的替换空格

2019-09-16 20:39:58  阅读:214  来源: 互联网

标签:P2 index C++ 空格 offer2 str 字符串 new


1. 题目描述

      请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

2. 思路和方法:

2.1 不建议的方法:

      简单暴力解法,从头到尾遍历字符串,碰到空格,首先将后面的所有字符串往后移动2个字符,才能空出3个字符位子插入字符“%20”,对于一个长度为n的字符串,对每个空格,需要移动后面O(n)个字符,因此包含n个空格的字符串,总的时间复杂度为O(n*n)。

2.2 建议使用的方法:

      中心思想:统计字符串中空格的个数,计算扩容字符串后的长度,然后执行复制和替换。我们从后往前开始替换,首先遍历一遍字符串,统计出空格的个数,并由此能够计算出替换之后的字符串的长度。接着再次从后往前遍历字符串,同时设置两个指针P1和P2,P1指向原始字符串末尾,P2指向替换之后的字符串末尾。我们向前移动P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。然后把P1向前移动一格,在P2之前插入字符串“%20”,同时P2向前移动3格。重复此过程,直到所有的空格都已替换完。这种做法的时间复杂度为O(n)。

3. C++实现 

#include<iostream> 
/*
将字符串中的空格替换成%20
*/
class Solution {
public:
	void replaceSpace(char *str, int length) {
		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;

		int index_original = original_length;	//原始字符串末尾索引值
		int index_new = new_length;				//计算长度后的字符串末尾索引值

		/*index_original指针开始向前移动,如果遇到空格,替换成'%20',否则进行复制操作*/
		while (index_original >= 0 && index_new > index_original){
			if (str[index_original] == ' '){
				str[index_new--] = '0';
				str[index_new--] = '2';
				str[index_new--] = '%';
			}
			else{
				str[index_new--] = str[index_original];
			}
			--index_original;
		}
	}
};

int main(){
	Solution a;
	char s[] = "hello world! ";
	printf("%s\n", s);
	a.replaceSpace(s, 13);
	printf("?%s? ", s);
	getchar();
	return 0;
}

参考资料

https://blog.csdn.net/YF_Li123/article/details/70332267

https://blog.csdn.net/yeqiang19910412/article/details/81567403

标签:P2,index,C++,空格,offer2,str,字符串,new
来源: https://blog.csdn.net/qq_31965863/article/details/100899976

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有