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

仅供自己学习

 

思路:

可以直接把0~n-1的位置的元素加入到s后面,然后再把0~n-1的元素删除即可。分别调用append,erase函数

 

代码:

1 class Solution {
2 public:
3     string reverseLeftWords(string s, int n) {
4         
5         s.append(s,0,n);
6         s.erase(0,n);
7         return s;
8     }
9 };

 

还有一种 (A⁻¹B⁻¹) ⁻¹ = BA,例如a,b,c,d,e  , n=2.  反转A,b,a,c,d,e 反转B,b,a,e,d,c,反转A逆B逆,c,d,e,a,b

 

代码:

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(),s.begin()+n);
        reverse(s.begin()+n,s.end());
        reverse(s.begin(),s.end());
        return s;
    }
};

 

如果遍历加入一个新的string,可以考虑从i=n开始,循环条件为i<n+s.length(),s的下标为 i%s.length,这样就弄从n加到s.length,在加入0-n的元素。

 

还可调用C++的STL中rotate算法

1 class Solution {
2 public:
3     string reverseLeftWords(string s, int n) {
4         rotate(s.begin(),s.begin()+n,s.end());
5         return s;
6     }
7 };

 

上一篇:面试题58-Ⅰ、58-Ⅱ、59-Ⅰ、59-Ⅱ


下一篇:多业务融合推荐策略实践与思考