力扣刷题Day8 |字符串Part01:344.反转字符串,541. 反转字符串II ,卡码网:54.替换数字,151.翻转字符串里的单词,卡码网:55.右旋转字符串

344.反转字符串

题目链接:https://leetcode.cn/problems/reverse-string/description/
文章讲解/视频讲解:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html

这一题在循环条件的判断上我没搞清楚,我把i的停止条件设置为 i <= s.size()/2,但实际上应该是小于,不能等于。比如字符串长度为4,则i=0,1的时候就已经完成了反转,当i=4/2=2时,j=1,此时已经不满足i<j了,所以这里不能取等于。

那或许可以直接把条件设置为i<j,我试了一下这也是可以通过的,那这个条件简单一点。

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

541. 反转字符串II

题目链接:https://leetcode.cn/problems/reverse-string-ii/description/
文章讲解/视频讲解:https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html

这一题有一个重要的技巧是直接让 i+=2*k。这样就不用一个一个遍历,效率高了很多。

遇到的几个问题:

1、因为对C++的reverse函数用法不熟悉,所以不知道原来reverse的第二个参数是不包含在反转的范围里的,边界条件写错了。

这里附上reverse的用法
reverse 函数能够将给定范围内的元素反转。当使用 reverse 函数时,需要提供两个迭代器:一个指向范围开始的迭代器和一个指向范围结束的迭代器。这个函数会反转从第一个迭代器到第二个迭代器之间的元素,不包括第二个迭代器指向的元素。

class Solution {
public:
    string reverseStr(string s, int k) {
        for(int i = 0; i < s.length(); i += 2 * k) {
            if(i + k < s.length()) {
                reverse(s.begin() + i, s.begin()+ i + k);
            }
            else {
                reverse(s.begin() + i, s.end());
            }
        }
        return s;
    }
};

2、这里用size和length都可以吗?

在C++中,std::string 类型提供了两个函数来获取字符串的长度:size() 和 length()。这两个函数在 std::string 类中是等价的,它们都返回字符串中字符的数量。

如果同时在处理 std::string 和其他容器(如 std::vector),则建议使用 size(),因为 size() 可以获取容器中元素的数量,而length不行。

卡码网:54.替换数字

题目链接:https://kamacoder.com/problempage.php?pid=1064
文章讲解:https://programmercarl.com/kama54.%E6%9B%BF%E6%8D%A2%E6%95%B0%E5%AD%97.html

有个需要注意的地方:
扩充数组的时候为什么是count*5,“number”不是六个字母吗?
因为替换之后原来的数字就没有了,就会多出一个位置,因此是5不是6。

#include<iostream>
using namespace std;
int main(){
    string s;
    while(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();

        // i指向原数组,j指向新数组
        for(int i = sOldSize - 1, j = sNewSize - 1; i >= 0; i--, j--) {
            if(s[i] < '0' || s[i] > '9') { //遇到的不是数字
                s[j] = s[i];
            }
            else {
                s[j] = 'r';
                s[j - 1] = 'e';
                s[j - 2] = 'b';                
                s[j - 3] = 'm';     
                s[j - 4] = 'u'; 
                s[j - 5] = 'n';   
                j -= 5;         
            }
        }
        cout << s << endl;
    
    }
}

151.翻转字符串里的单词

题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/description/
文章讲解/视频讲解:https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html

对代码中&符号的用法还是不太理解

class Solution {
public:
    void reverse(string& s, int start, int end) {
        for(int i = start, j = end; i < j; i++, j--) {
            swap(s[i], s[j]);
        }
    }

    void RemoveExtraSpaces(string& s) {
        int slow = 0;
        for(int i = 0; i < s.size(); i++) {
            if(s[i] != ' ') { // 只有遇到单词才执行以下语句,空格直接跳过
                if(slow != 0) {
                    s[slow++] = ' ';
                }
                while(i < s.size() && s[i] != ' ') {
                    s[slow++] = s[i++];
                }
            }
        }
        s.resize(slow);
    }

    string reverseWords(string s) {
        RemoveExtraSpaces(s);
        reverse(s, 0, s.size() - 1);

        int start = 0;

        for(int i = 0; i <= s.size(); i++) {
            if(s[i] == ' ' || i == s.size()) {
                reverse(s, start, i - 1);
                start = i + 1;
            }
        }
        return s;
    }
};

卡码网:55.右旋转字符串

题目链接:https://kamacoder.com/problempage.php?pid=1065
文章讲解:
https://programmercarl.com/kama55.%E5%8F%B3%E6%97%8B%E5%AD%97%E7%AC%A6%E4%B8%B2.html

#include<iostream>
#include<algorithm>

using namespace std;
int main() {

    int n;
    string s;
    cin >> n;
    cin >> s;

    reverse(s.begin(),s.end());
    reverse(s.begin(), s.begin() + n);
    reverse(s.begin() + n, s.end());

    cout << s << endl;
}
  • 35
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值