剑指offer_替换空格(逆序遍历的思想)

今天做了第二道题目。首先回顾一下昨天的题目,一个二维数组,从左到右,从上到下逐渐增加。
可以使用两种方法,分别是暴力方法,另外一种是采用二分查找法。

题目

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

思路

如果从前开始朝后面遍历,则遇到空格进行替换的时候,很容易把后面的字符串给覆盖掉了,这是我们不需要的。所以必须要从后面开始读起来。

class Solution {
public:
	void replaceSpace(char *str,int length) {
			if(str==nullptr || length < 0)  return;
			int length_new;
			int cnt;
			for(int i = 0; i < length; ++i){
			if(str[i] = ' ')  cnt++;
			}
			if(!cnt) return;
			length_new = length + cnt*2;
			if(int j = length; j >+0; j--)
			{
				if(str[length--] = ' ') {
			 		str[length_new--]  = '%';
			 		 str[length_new--]  = '2';
			 		 str[length_new--]  = '0';
			 	}else{
				  str[length_new--]  = str[j];
				 }
			}
			
        }
        
	}

参考函数

这是c语言里面的一个函数。

函数功能就是:将起始地址src且长度为count的内存拷贝到起始地址dst处,并返回dst,返回是为了实现链式表达式。

void* __cdecl memmove (void *dst, const void *src, size_t count) 
{
    void *ret = dst;
    if (dst <= src || (char *)dst >= ((char *)src + count)) 
    {
        // 若dst 和 src区域没有重叠,则从起始处开始逐一拷贝
        while (count--) 
        {
            *(char *)dst = *(char *)src;
            dst = (char *)dst + 1;
            src = (char *)src + 1;
        }
    }
    else 
    {
        // 区域重叠,从尾部开始拷贝
        dst = (char *)dst + count - 1;
        src = (char *)src + count - 1;
        while (count--) 
        {
            *(char *)dst = *(char *)src;
            dst = (char *)dst - 1;
            src = (char *)src - 1;
        }
    }
    return (ret);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值