【牛客网刷题】剑指Offer第二题——替换空格

题目描述

【牛客网刷题】剑指Offer第二题——替换空格

这个题目也没有测试用例,而且给出的C++定义的函数实现结构是这样的:

【牛客网刷题】剑指Offer第二题——替换空格

原来一直以为这个length参数是字符串的长度;后来一直通不过测试用例,看了原书才知道这个length是字符串指针str指定的最长数组长度!! 而且这个题目也没说让原地置换,因为这个length就是为原地置换而给出的! 所以感觉题目说的不清楚搞得很伤。

所以明白了这道题的真实用意之后:要求原地替换(就是不使用别的辅助数组空间),然后length是限定的一个最长数组长度,也就是str的最大容量。而且最好你的算法时间复杂度是O(N),不然O(N*N)是很容易想的,测试用例估计会报超时。

思路:先统计str的空格数目spaceNum,同时计算原数组str的真实字符串长度originLen,那么替换之后变长的字符串长度就是oringinLen + spaceNum * 2 ; 跟length比较一下,如果没超过就可以往下面进行了。 接着咱从后往前替换,倒着遍历原字符串str,然后替换后的字符也倒着从后往前存起来。

代码如下:

class Solution {
public:
	void replaceSpace(char *str,int length) {
		int originalStrlen = 0, spaceNum = 0; //原字符串长度,空格数目
		int i = 0;
		while (str[i] != '\0')
		{
			++originalStrlen;
			if(str[i] == ' ')
				++spaceNum;
			++i;
		}
		int newLen = originalStrlen + 2 * spaceNum;//计算替换后的字符串的长度
		if(newLen > length) return;//看看计算的新长度是不是比函数给出的length大

		int indexOrigin = originalStrlen, indexNew = newLen;
		while (indexOrigin >= 0 && indexNew > indexOrigin)//从后往前替换
		{
			if(str[indexOrigin] == ' ')
			{
				str[indexNew--] = '0';
				str[indexNew--] = '2';
				str[indexNew--] = '%';
			}else{
				str[indexNew--] = str[indexOrigin];
			}
			--indexOrigin;
		}
	}
};