剑指offer笔记(六)字符串空格替换

字符串空格替换

题目:实现一个函数,把字符串中的每一个空格替换为“%20”,eg:we are happy  替换为 we%20are%20happy

由原来一个空格字符,替换之后变成%,2,0三个字符,因此替换之后的字符串会变长

此时需要考虑是否在原字符串基础上进行修改

  • 如果不考虑内存空间是否充足,可以直接考虑再开辟一块空间进行新字符串存放,基于C++STL模板类直接进行遍历,遇到空格替换添加至新串即可,代码如下:
class Replacement {
public:
	string replaceSpace(string iniString, int length) {
		// write code here
		string newStr;
		for (int i = 0; i < length; i++){
			if (iniString[i] == ' '){
				newStr.push_back('%');
				newStr.push_back('2');
				newStr.push_back('0');
			}
			else{
				newStr.push_back(iniString[i]);
			}
		}
		return newStr;
	}
};
  •  如果考虑在原字符串基础上进行修改,需要先对原字符串进行扩容,扩容之后,如果从头到尾进行遍历。每一次替换都会导致后续字符被覆盖,对此需要不断向后移动替换位置之后的字符
  • 如果选择逐个从后往前遍历依次赋值,时间复杂度将会从O(n^2)缩减到O(n)

  • 代码如下:
class Replacement {
public:
    string replaceSpace(string iniString, int length) {
        if(length<=0)
            return iniString;
        int blank = 0;
        for(int i=0;i<length;++i)
            if(iniString[i]==' ')
            	++blank;
        int newLength = length+(blank*2);
        iniString.resize(newLength);
        int index1 = length-1;//指向原字符串结尾
        int index2 = newLength-1;//指向新字符串结尾
        while(index1>=0 && index2>index1){
            if(iniString[index1]==' '){
				iniString[index2--]='0';
                iniString[index2--]='2';
                iniString[index2--]='%';
            }
            else
                iniString[index2--]=iniString[index1];
            --index1;
        }
        return iniString;
    }
};
  • 如果考虑在原字符串基础上进行修改,除了扩容使用resize之外,可以通过STL特性进行编写,代码更加简洁高效,代码如下:
class Replacement {
public:
    string replaceSpace(string iniString, int length) {
        if(length<=0)
            return iniString;
        //STL模板string特性
        for(int i=0;i<length;i++)
        {
            if(iniString[index1]==' '){
                iniString.erase(i,1);
                iniString.insert(i,"%20");
            }
        }
        return iniString;
    }
};

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HT . WANG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值