reverse库函数的易错点

本文探讨了在LeetCode 541题中使用C++库函数`reverse`进行字符串反转时的常见错误。关键点在于理解`reverse(s.begin(), s.end())`反转整个字符串,而`reverse(it, it+6)`则反转从`it`到`it+5`的子串。文章通过对比自定义反转函数和库函数的实现,强调了反转区间右端点的理解,并提供了两种解决方案的代码示例。

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

在使用reverse库函数时,有一个重要的易错点就是指定反转的区域,在leetcode541中,没使用库函数可以轻松过关,但改用库函数后发现一直有小问题。这是因为库函数revers(s.begin(),s.end()),的作用区域没有搞明白
revers(s.begin(),s.end())是将s整体反转,但回想一下,end()是最后一个元素的下一位的迭代器,所以如果我们想将区间it后的5个子字符串反转时,需要将作用区域设置为it+6,即reverse(it,it+6)

顺便把541题目答案贴一下

1.使用库函数

class Solution {
public:
    string reverseStr(string s, int k) {
        int i=0;
        while((i+k)<s.size())
        {
            int q=i+k;
            reverse(s.begin()+i,s.begin()+q);
            i+=2*k;
        }
        reverse(s.begin()+i,s.end());
        return s;
    }
};

2.自己转换

class Solution {
public:
    string reverseStr(string s, int k) {
        int i=0;
        while((i+k)<s.size())
        {
            int p=i,q=i+k-1;
            while(p<q)
            {
                char temp=s[p];
                s[p++]=s[q];
                s[q--]=temp;
            }
            i+=2*k;
        }
        if(int nums=(s.size()-i))
        {
            int p=i,q=i+nums-1;
            while(p<q)
            {
                char temp=s[p];
                s[p++]=s[q];
                s[q--]=temp;
            }
        }
        return s;
    }
};

两种方式最大的区别就是反转区别的右端q是否减1,这就是因为reverse的右端作用域是指向要反转字符的下一位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值