【剑指Offer-58-II】左旋转字符串

问题

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例

输入: s = "abcdefg", k = 2
输出: "cdefgab"

解答1:substr

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        return s.substr(n) + s.substr(0, n);
    }
};

解答2:字符串拼接

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        string res;
        for (int i = n; i < n + s.size(); i++) // 注意i的终止条件
            res += s[i % s.size()]; // 注意取余操作
        return res;
    }
};

解答3:原地旋转

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s, 0, n - 1); // 可以直接用内置reverse函数,这里复习一下reverse的写法
        reverse(s, n, s.size() - 1);
        reverse(s, 0, s.size() - 1);
        return s;
    }
private:
    void reverse(string& s, int left, int right) {
        while (left < right) swap(s[left++], s[right--]);
    }
};

或使用STL函数

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(), s.end());
        reverse(s.begin(), s.end() - n);
        reverse(s.end() - n, s.end());
        return s;
    }
};
posted @ 2021-03-06 17:11  tmpUser  阅读(27)  评论(0编辑  收藏  举报