【剑指offer】面试题05. 替换空格

解题思路

该题第一眼思路是暴力法,时间复杂度O(n^2),即从前面开始遍历,碰到空格,则使字符向后移,因此复杂度高;使用双指针法,从后往前移,使得只需要O(n)时间复杂度即可解决
双指针法参考自剑指offer,思路见下图
【剑指offer】面试题05. 替换空格_第1张图片
另外,可以使用string函数,解题速度更快

代码

/*双指针法*/
class Solution {
public:
	string replaceSpace(string s) {
		if (s.size()==0)//特判
		{
			return "";
		}
		int len1 = s.size();
		int count = 0;
		for (int i = 0; i < len1; i++)
		{
			if (s[i]==' ')
			{
				count++;
			}
		}
		int p1 = len1-1, p2 = len1 + count * 2-1;//p1指向原始字符串的最后一个字符,p2指向新字符串的最后一个字符
		string temp(count * 2, ' ');
		s += temp;
		while (p1!=p2)//两者未相遇
		{
			if (s[p1]==' ')//为空格
			{
				p1--;//p1先移动一位
				for (int i=0;i<3;i++)//p2移动3三位,并增加字符串%20
				{
					if (i==0)
					{
						s[p2--] = '0';
					}
					else if(i==1)
					{
						s[p2--] = '2';
					}
					else 
					{
						s[p2--] = '%';
					}
					
				}
			}
			else {//不为空格,则后移
				s[p2--] = s[p1--];
			}
		}
		return s;
	}
};


/*利用find,replace函数,写法简单,思路清晰*/
class Solution {
public:
	string replaceSpace(string s) {
		string::size_type pos;
		while (true)
		{
			if ((pos=s.find(" "))!=string::npos)//find每次找到出现的第一个空格,如果能找到空格,则将其替换
			s.replace(pos, 1, "%20");
			else break;
			
		}
		return s;
	}
};

解法2

解题思路

C++使用string解这道题很容易
对字符串进行遍历,如果是空格的话,则换成%20

在剑指offer书上,由于使用的是C语言风格求解,其需要移位,因此代码量大,但思路相同

时间复杂度O(n)
空间复杂度O(n+3k) k为空格数
在LeetCode上是双百通过

代码

class Solution {
public:
	string replaceSpace(string s) {
		string ans = "";
		for (auto c : s) {
			if (c != ' ') {
				ans += c;
			}
			else {
				ans += "%20";
			}
		}
		return ans;
	}
};

你可能感兴趣的:(【魂】算法)