描述
给定一个字符串(以字符数组的形式给出)和一个偏移量,根据偏移量原地旋转字符串(从左向右旋转)
offset >= 0
str的长度 >= 0
样例
样例 1:
输入: str="abcdefg", offset = 3
输出: str = "efgabcd"
样例解释: 注意是原地旋转,即str旋转后为"efgabcd"
样例 2:
输入: str="abcdefg", offset = 0
输出: str = "abcdefg"
样例解释: 注意是原地旋转,即str旋转后为"abcdefg"
样例 3:
输入: str="abcdefg", offset = 1
输出: str = "gabcdef"
样例解释: 注意是原地旋转,即str旋转后为"gabcdef"
样例 4:
输入: str="abcdefg", offset =2
输出: str = "fgabcde"
样例解释: 注意是原地旋转,即str旋转后为"fgabcde"
样例 5:
输入: str="abcdefg", offset = 10
输出: str = "efgabcd"
样例解释: 注意是原地旋转,即str旋转后为"efgabcd"
挑战
在数组上原地旋转,使用O(1)的额外空间
代码
class Solution {
public:
/**
* @param str: An array of char
* @param offset: An integer
* @return: nothing
*/
void rotateString(string &str, int offset) {
// write your code here
string a = str;
int i,j=0;
if(str.size() == 0)
return;
offset %= str.size();
for (int i = str.size()-offset; i < str.size(); i++) {
/* code */
str[j++] = a[i];
}
for (int i = 0; i < str.size()-offset; i++) {
/* code */
str[j++] = a[i];
}
}
};
上面的方法执行提交后,你会发现效率还是非常低的,下面给出了优化后的方法,利用str的特性,其中一个substr方法截取字符串。
class Solution {
public:
/**
* @param str: An array of char
* @param offset: An integer
* @return: nothing
*/
void rotateString(string &str, int offset) {
// write your code here
if(str.size()==0 || offset == 0){
return;
}
if(offset >= str.size())
offset %= str.size();
string s1 = str.substr(str.size()-offset,offset);
string s2 = str.substr(0,str.size()-offset);
str = s1+s2;
}
};