首页 > 解决方案 > reverse() 函数是如何工作的?

问题描述

我正在尝试为每个 k、2k、3k..etc 位置反转 k 个字符,并且我使用了 reverse() 函数。为什么 reverse(s.begin() + l, s.begin() + r -1) 根本不改变字符串。如果我删除了 -1,它将完美运行。我是初学者,请给我一些解释。我很感激。


Input: s = "abcdefg", k = 2
Output: "bacdfeg" 
MyOutput: "abcdefg"

class Solution {
    public:
        string reverseStr(string s, int k) {
            int l = 0;
            int r = min(k, (int)s.length());
    
            while(l < s.length()){
                reverse(s.begin() + l, s.begin() + r -1);
                l += 2*k;
                r = min(l + k, (int)s.length());
            }
            return s;
        }
    };

标签: c++

解决方案


你的逻辑有问题。考虑您的示例, k=2, s="abcdefg"

你的循环这样做:

while(l < s.length()){
    reverse(s.begin() + l, s.begin() + r -1);
    l += 2*k;
    r = min(l + k, (int)s.length());
}

您第一次通过,l 为 0,r 为 2,调用:

reverse(s.begin() + 0, s.begin + 1)

结束迭代器紧跟在范围中的第一个元素之后,因此您正在反转单个元素,它什么都不做。

第二次通过,l 为 4,r 为 6

reverse(s.begin() + 4, s.begin() + 5)

另一个 1 元素范围,反转什么都不做。

然后循环结束。

我想问题是,如果它在不从 r 中减去 1 的情况下工作,那么为什么要从 r 中减去 1?


推荐阅读