剑指offer--- 空格替换

题目描述

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

使用语言:C++(clang++3.9)

时间限制:< 1s

空间限制:< 32M


解题思路:

题目考查重点应该是字符串的存储和指针,用面向对象来实现确实没什么意思,直接将str转成string对象处理起来相当简单,但这偏离了本意.如过纯用C来写还是有点意思的.可以采用两种思路:

一.有缓存的方法,就是建立临时数组,将字符串按顺序一个个存到数组中,遇到空格则存%20,检索完之后,再返回数组的地址.实现起来简单,但空间复杂度变高大约,相当于Copy了一边数组.时间复杂度是O(n),空间复杂度是O(2n)

二.不建立缓存,但是思路还是一样的.考虑到字符串轮讯一遍后,指针会指向最尾端,同时可以知道空格数,因此可以原地扩充存储空间大小,然后再逆序回去,利用扩充空间两个指针之间的插值位置,即可实现数据的复制.



 实现思路二:

class Solution {
public:
    void replaceSpace(char *str,int length) {
      char* str_temp = str;
        char* str_return = NULL;
        int space_count = 0;
        int str_len = 0;
        // 先判断出空格数;
        while (*str_temp != '\0') {
            if (*str_temp == ' ') {
                space_count++;
            }
            str_temp++;
            str_len++;
        }
        //这里要算上结束符
        str_temp++;
        str_len++;
        //这个时候,str_temp指在str的最末位,同时知道了空格的个数,我们只需要在str末尾再开辟出space_count*3的位置,就可以存下新的字符串;
        str_return = str_temp + space_count * 2; // 将需返回的字符串指向最末位,接下来,实现拷贝就行了,注意此处并未开辟新的空间,而是将原来的字符串重新放在了增加空间的源地址上;
        while (str_len >= 0) {
 
            if (*str_temp == ' ') {
                *str_return = '0';
                *(str_return - 1) = '2';
                *(str_return - 2) = '%';
                str_return = str_return - 3;
                str_temp--;
            } else {
                *str_return = *str_temp;
                str_return--;
                str_temp--;
            }
            str_len--;
        }
        str = str_return;
        str_return = NULL;
        str_temp = NULL;
    }
};


实验结果:

运行时间:3ms     占用内存:504k

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值