代码随想录算法训练营第八天|344.反转字符串、541.反转字符串Ⅱ、卡码网:54.替换数字、151反转字符串中的单词、卡码网:55.右旋字符串

文档链接:代码随想录

LeetCode344.反转字符串

题目链接:https://leetcode.cn/problems/reverse-string/

思路:这道题很简单,没什么好说的。注意一下什么时候能用库函数,什么时候不能用库函数就好。

直接干:

class Solution {
public:
    void reverseString(vector<char>& s) {
        char temp;
        for(int i = 0; i < s.size() / 2; i++) {
            temp = s[i];
            s[i] = s[s.size() - 1 - i];
            s[s.size() - 1 - i] = temp;
        }
    }
};

双指针法:

class Solution {
public:
    void reverseString(vector<char>& s) {
        for(int i = 0, j = s.size() - 1; i < j; i++, j--) {
            swap(s[i], s[j]);
        }
    }
};

LeetCode541.反转字符串Ⅱ

题目链接:https://leetcode.cn/problems/reverse-string-ii/

思路:不要惯性思维每次都i++,其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。

代码:

class Solution {
public:
    string reverseStr(string s, int k) {
        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;
    }
};

卡码网54.数字替换

题目链接:https://kamacoder.com/problempage.php?pid=1064

思路:不申请额外内存空间,采用双指针法。

其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

这么做有两个好处:

  1. 不用申请新数组。
  2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。

双指针法:

#include<iostream>
using namespace std;

int main() {
    string s;
    cin >> s;
    int count = 0;
    int sOldSize = s.size();
    for(int i = 0; i < sOldSize; i++) {
        if(s[i] >= '0' && s[i] <= '9') {
            count++;
        }
    }
    s.resize(sOldSize + count * 5);
    int sNewSize = s.size();
    for(int i = sNewSize - 1, j = sOldSize - 1; j < i; j--, i--) {
        if(s[j] >= '0' && s[j] <= '9') {
            s[i--] = 'r';
            s[i--] = 'e';
            s[i--] = 'b';
            s[i--] = 'm';
            s[i--] = 'u';
            s[i] = 'n';
        }else {
            s[i] = s[j]; 
        }
    }
    cout << s << endl;
}

LeetCode.151反转字符串中的单词

题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/

思路:今天有一点思路了,但是力扣上运行不了,我在devC++都可以正常运行。先想办法去除多余的空格,再作一次整体局部反转。

解决了解决了!slow没有初始化!slow = 0就可以了!

双指针法:

class Solution {
public:
    void removeExtraSpaces(string &s) {
        int slow;
        for(int fast = 0; fast < s.size(); fast++) {
            if(s[fast] != ' ') {
                if(slow != 0) {
                    s[slow++] = ' ';
                }
                while(fast < s.size() && s[fast] != ' ') {
                    s[slow++] = s[fast++];
                }
            }
        }
        s.resize(slow);
    }
    string reverseWords(string s) {
        removeExtraSpaces(s);
        reverse(s.begin(), s.end());
        int start = 0;
        for(int i = 0; i < s.size(); i++) {
            if(s[i] == ' ') {
                reverse(s.begin() + start,s.begin() + i);
                start = i + 1;
            }
        }
        reverse(s.begin() + start, s.end());
        return s;
    }
};

卡码网55.右旋字符串

题目链接:https://kamacoder.com/problempage.php?pid=1065

思路:两次反转得到结果,可以先整体后局部,也可以先局部后整体。

先整体后局部:

#include<iostream>
#include<algorithm>
using namespace std;

int main() {
    int k;
    string s;
    cin >> k;
    cin >> s;
    reverse(s.begin(), s.end());
    reverse(s.begin(), s.begin() + k);
    reverse(s.begin() + k, s.end());
    cout << s << endl;
}

先局部后整体:

#include<iostream>
#include<algorithm>
using namespace std;

int main() {
    int k;
    string s;
    cin >> k;
    cin >> s;
    reverse(s.begin(), s.end() - k);
    reverse(s.end() - k, s.end());
    reverse(s.begin(), s.end());
    cout << s << endl;
}

总结:怎么感觉到现在越来越难了,C++也是没时间去学,写了一整天,今天五个题还没写完,不明白为什么只要跟代码随想录网站上给出来的写的不一样就不通过。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值