剑指offer58-II.左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
方法:把前k个反转一次,再把后n-k个反转一次,再把整体反转一次
说明一下:此题的关键一步是需要将n %= s.size().因此字符串一旦旋转长度次后就会恢复原状,因此不会一直循环下去。这一步是非常重要的。
class Solution {
public:
void reverse(string& s,int begin,int end){
if(begin>end) return;
while(begin<end){
swap(s[begin],s[end]);
begin++,end--;
}
}
string reverseLeftWords(string s, int n) {
int size = s.size();
n%=size;
reverse(s,0,n-1);
reverse(s,n,size-1);
reverse(s,0,size-1);
return s;
}
};
方法二:原地修改。 扩容原字符串n个长度,把原字符串的前n个字符复制到后面,最后删掉前n个字符即可
class Solution {
public:
string reverseLeftWords(string s, int n) {
int len =s.size();
n %= s.size();
s.resize(len+n);
for(int i = 0;i<n;i++){
s[len++] = s[i];
}
s.erase(0,n);
return s;
}
};