欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

替换空格

程序员文章站 2022-07-15 16:16:01
...

问题描述

将一个字符串中的空格替换成 “%20”。

Input:
"We Are Happy"
Output:
"We%20Are%20Happy"

解题思路

  1. 在原字符串地址空间进行操作,length(新)>length(旧),来节省空间
  2. 利用char*字符串的==’\0’==来完成遍历,求取新字符串长度
  3. 令 P1 指向字符串原来的末尾位置,P2 指向字符串现在的末尾位置。P1 和 P2 从后向前遍历,当 P1 遍历到一个空格时,就需要令 P2 指向的位置依次填充 02%(注意是逆序的),否则就填充上 P1 指向字符的值。
    从后向前遍是为了在改变 P2 所指向的内容时,不会影响到 P1 遍历原来字符串的内容。

代码

main()中用到了char* 内存空间的分配问题

#include <iostream>
#include <vector>
#include <string>
using namespace std;

// 思路
//1:从前往后插入,这样移动·的次数多不建议
//2:从后往前插入
class Solution {
public:
	void repalceSapce(char *str, int length) 
	{
		//遍历一边字符串找出空格的数量
		if (str == NULL || length < 0)
			return;
		int i = 0;
		int oldnumber = 0;//记录以前的长度
		int replacenumber = 0;//记录空格的数量
		while (str[i] != '\0')
		{
			oldnumber++;
			if (str[i] == ' ')
			{
				replacenumber++;
			}
			i++;
		}
		int newlength = oldnumber + replacenumber * 2;//插入后的长度
		if (newlength > length)//如果计算后的长度大于总长度就无法插入
			return;
		int pOldlength = oldnumber; //注意不要减一因为隐藏个‘\0’也要算里
		int pNewlength = newlength;
		while (pOldlength >= 0 && pNewlength > pOldlength)//放字符
		{
			if (str[pOldlength] == ' ') //碰到空格就替换
			{
				str[pNewlength--] = '0';
				str[pNewlength--] = '2';
				str[pNewlength--] = '%';
			}
			else //不是空格就把pOldlength指向的字符装入pNewlength指向的位置
			{
				str[pNewlength--] = str[pOldlength];
			}
			pOldlength--; //不管是if还是elsr都要把pOldlength前移
		}
	}
};

int main()
{
	Solution sol;
	string strTmp = "We are happy";
	char* str = new char[24];
	strcpy_s(str, 13, strTmp.c_str());
	sol.repalceSapce(str, 24);
	cout << str << endl;
	system("pause");
	return 0;
}