剑指offer:请实现一个函数,完成将一个字符串中的每个空格替换为字符串的功能。

方法一:

从头到尾扫描字符串,如果发现空格,必须把后面的字符向后移动两个字符在替换,否则会发生覆盖。

时间复杂度为O(n²),效率较低不推荐使用。

方法二:

从后向前遍历,统计空格出现次数,并可以计算出替换后的字符串总长度(每替换一个空格,长度增加两个字节,

因此替换后的长度等于原长度加上二倍的空格出现次数)

准备两个指针,一个在字符串原来的末尾另一个在替换后的末尾,遇见空格反向赋值%,0,2,其他直接替换

代码:

class Solution {
public:
	//length为字符数组的总容量
	void replaceSpace(char *str, int length) 
	{
		if (str == NULL || length <= 0)
			return;
		//num_space为空格数量
		//str_length为字符串实际长度
		int num_space = 0;
		int str_length = 0;
		int i = 0;
		while (str[i] != '\0')
		{
			if (str[i] == ' ')
			{
				++num_space;
				++str_length;
			}
			else
			{
				++str_length;
			}
			++i;
		}
		if (num_space <= 0)
			return;

		int new_num = str_length + 2 * num_space;
		//new_num为替换后字符的长度
		int new_length_index = str_length;
		int new_num_index = new_num;

		while(new_num_index >= new_length_index && new_length_index >= 0)
		{
			if (str[new_length_index] == ' ')
			{
				str[new_num_index--] = '0';
				str[new_num_index--] = '2';
                str[new_num_index--] = '%';
			}
			else
			{
				str[new_num_index--] = str[new_length_index];
			}
			--new_length_index;
		}
	}
};

测试:

int main()
{
	char arr[16] = "we are happy";
	char* str = &arr[0];
	Solution s;
	s.replaceSpace(str,15);
	int i = 0;
	for(i=0;i<15;i++)
	{
		cout << arr[i] ;
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/W_J_F_/article/details/82875452