剑指offer 题目2

140 阅读2分钟

题目描述

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

大致思路

  • 首先,想到的是一个个遍历,遇到空格就存 “%20” ,但是这样会覆盖后面的数据。
  • 为了解决上述问题,需要一个中间的量保存一下,这里我想到了字符串。最后再将字符串赋值给原字符指针。
  • 如果不允许中间量的话,那么在原数据基础上操作,那么可以考虑先把所有空格的数量统计出来,然后在原来长度的基础上再加上 2 倍空格数的长度(原本空格占一位)。最后从原数据的最末开始写,遇到空格就转换一下。

代码

方案一:

void replaceSpace(char *str, int length) {
	string str_s = "";
	for (int i = 0; i <= length; ++i) {
		if (str[i] == ' ') {
			str_s += "%20";
		}
		else{
			str_s += str[i];
		}
	}

	for (int i = 0; i < str_s.length(); i++){
		str[i] = str_s.c_str()[i];
	}
}

方案二:

void replaceSpace(char *str, int length) {
	int num = 0;
	for (int i = 0; i < length; ++i) {
		if (str[i] == ' ')
			++num;
	}

	for (int i = length - 1; i >= 0 && num > 0; --i) {
		if (str[i] == ' ') {
			str[i + 2 * num] = '0';
			str[i + 2 * num - 1] = '2';
			str[i + 2 * num - 2] = '\%';
			--num;
		}
		else
			str[i + 2 * num] = str[i];
	}
}

结论

思路倒是不难,主要是写的过程中注意一些细节,比如用 string 赋值到原字符指针时,原本想直接把 string 里的字符数组的首地址赋值过去的,但是发现这是指针,不是指针引用不能改变原有指针的地址,最后又想到字符串操作的 strcpy, snprintf 等直接赋值,但是事实发现有点麻烦,各种安全函数替换。放弃了,还是自己手动一个个赋值最方便,毕竟这题目根本不考虑安全性问题,在原有基础上直接在后面加长度,能安全?方案二的话除了被扩充长度时空格 2 倍那里没注意到,调试的时候发现数据不对才想到,忘记算上原本空格长度了,-_-||