[剑指Offer]笔记2.替换空格 C++实现

本文介绍了一种将字符串中空格替换为“%20”的算法实现,详细讲解了暴力法和改进后的空间优化方法,并提供了C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description

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

Mentality

由于本题要求把一个空格替换为三个字符,即%20,则在长度上,新字符串的长度变为原字符串加上两倍的空格数,可从此处解题。

1.暴力法:开辟一个新字符串,把原字符串的值复制进去。首先遍历一遍原字符串,得出原长度和空格数,算出新字符串的长度。然后遇到不是空格的字符就直接拷贝,遇到的是空格就放入“%20”。

由于暴力法消耗空间大,可以换个思路,减少空间开销。暴力法是从前往后遍历,可以改成从后往前遍历。由于本题给出了length,即原字符串str最大的空间,只要新字符串长度在此范围内,就可以不用开辟新空间,从后往前遍历,遇到不是空格的字符就直接往后挪,遇到的是空格就放入“%20”。

2.改进:和暴力法一样,要先遍历一遍原字符串,得出原长度和空格数,算出新字符串的长度。定义两个指针p1、p2,分别指向原字符串末尾和新字符串末尾,将新字符串末尾置为’\0’,然后开始从后向前遍历。若p1指向空格,则p2位置向前复制“%20”,否则将字符复制到p2指向的位置。直到p1=p2,说明复制完毕。

Code (C++)

class Solution {
public:
	void replaceSpace(char *str,int length) {
        int ori_len;
        int blank(0);
        for(ori_len=0; str[ori_len]!='\0'; ori_len++)
            if(str[ori_len]==' ')
                blank++;
        
        int new_len=ori_len+blank*2;
        str[new_len]='\0';
        int p1=ori_len-1,p2=new_len-1;
        while(p1>=0&&p2>p1){
            if(str[p1]==' '){
                str[p2--]='0';
                str[p2--]='2';
                str[p2--]='%';
            }
            else
                str[p2--]=str[p1];
            p1--;
        }
	}
};

已通过所有的测试用例,欢迎指正批评(´▽`ʃ♡ƪ)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值