reverse库函数的易错点

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

在使用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的右端作用域是指向要反转字符的下一位置

引用中给出了一个示例代码,其中定义了一个函数listReverse,用于反转链表。该函数接受一个SList类型的指针pList作为参数,并返回一个SList类型的指针pReverseHead,表示反转后的链表头节。具体实现是通过遍历链表,逐个将每个节的next指针指向前一个节实现的。最后返回反转后的链表头节pReverseHead。 引用中给出了一些数学函数的使用方法。Math.max(a,b)用于返回a和b中的较大值,Math.min(a,b)用于返回a和b中的较小值,Math.pow(a,digit)用于计算a的digit次方,Math.ceil(a)用于将a向上取整,Math.floor(a)用于将a向下取整。 引用中给出了将List转换为数组的方法,其中list.toArray(new String[list.size])用于将List转换为String类型的数组。 综上所述,库函数reverselist并没有直接提供,但我们可以根据引用中的示例代码,结合引用中的数学函数和引用中的List转数组方法,实现一个功能类似的函数来反转链表。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [反转链表(reverse list)](https://blog.csdn.net/sinat_34715587/article/details/89018392)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [算法题JAVA常用库函数](https://blog.csdn.net/weixin_45086316/article/details/117387977)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值