LeetCode题解 字符串(一):344 反转字符串;541 反转字符串II;剑指05 替换空格

字符串

344 反转字符串 easy

题意如题目,进阶解法是不给另外的数组分配额外的空间,原地修改数组,使用O(1)的空间复杂度解决这一问题。

看到这道题,不经意间就想到字符串的库函数reverse

一种简单的思路就是,先得到字符串的长度,从后往前遍历,将结果记录在一个额外的数组里

而为了满足进阶题解的要求,我们可以使用两个指针,分别从头尾往中间遍历,交换两者的值就可以了

void reverseString(vector<char>& s) {
    int len = s.size();
    for(int i = 0; i < len/2; i++) {
        swap(s[i],s[len-i-1]);
    }
}

另外,对于交换两个数值,可以使用swap函数,可以使用temp,亦可以使用位运算——异或,如下所示:

b = a^b;
a = a^b;
b = a^b;
541 反转字符串II easy

题目的要求是这样的:

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

按照题目要求,进行反转时就有两种情况,剩余的字符少于k个,和剩余的字符大于等于k个但小于2k个

所以用模拟法,结合上一道题中的reverse函数,代码如下:

string reverseStr(string s, int k) {
    int len = s.size();

    for(int i = 0; i < s.size(); i += (2*k)) {
        if(i + k <= s.size()) {
            reverse(s.begin() + i, s.begin() + i + k);
        }else{
            reverse(s.begin() + i, s.end());
        }
    }
    return s;
}
剑指05 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

这道题如果考虑用更少的时空复杂度来做,那么肯定不能再用个新的数组来记录结果

不过可以考虑扩容原有的数组,并从后往前遍历,用两个指针来记录原字符串的末尾和扩容后字符串的末尾

之所以从前往后遍历,因为在C++中,字符串被创建时,占用了一块连续的内存,在内存中为只读状态,并不可以像Java或者是python一样,直接添加新的字符,如果要从前往后遍历,遇到空格再修改,就需要把后面的字符都往后移相应的长度,时间复杂度就高了。

代码如下:

string replaceSpace(string s) {
    int len = s.size();
    int count = 0;
    for(char c: s) {
        if(c == ' ') count++;
    }

    s.resize(len + 2 * count);
    int newLen = s.size();
    for (int i = len - 1, j = newLen - 1; i < j; i--, j--) {
        if (s[i] != ' ') s[j] = s[i];
        else {
            s[j] = '0';
            s[j - 1] = '2';
            s[j - 2] = '%';
            j -= 2;
        }
    }
    return s;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值