Given a string and an offset, rotate string by offset. (rotate from left to right)
Example
Given "abcdefg"
.
offset=0 => "abcdefg"
offset=1 => "gabcdef"
offset=2 => "fgabcde"
offset=3 => "efgabcd"
Challenge
Rotate in-place with O(1) extra memory
给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)
样例
对于字符串 "abcdefg"
.
offset=0 => "abcdefg"
offset=1 => "gabcdef"
offset=2 => "fgabcde"
offset=3 => "efgabcd"
挑战
在数组上原地旋转,使用O(1)的额外空间
这道题的挑战是使用O(1)的额外空间,所以只能按照输入的数字来进行循环,所以我最开始直接使用了输入的offset来进行循环。
void rotateString(string &str, int offset) {
// write your code here
char a;
for(int i = 0; i < offset; i++)
{
a = str[str.length() - 1];
for(int j = str.length() - 1; j > 0; j--)
{
str[j] = str[j - 1];
}
str[0] = a;
}
}
检测完提示我,时间使用情况超过了预期,也就是说时间复杂度过高,也就是说循环的部分出现了问题,所以我想到,如果输入的offset比字符串的长度长的话,那么每循环一次字符串长度,字符串不会发生变化,所以对offset取字符串长度的余数,这样就解决了关于时间复杂度的问题。
void rotateString(string &str, int offset) {
// write your code here
offset = offset % str.length();
char a;
for(int i = 0; i < offset; i++)
{
a = str[str.length() - 1];
for(int j = str.length() - 1; j > 0; j--)
{
str[j] = str[j - 1];
}
str[0] = a;
}
}
这样检测完之后,又出现了一个错误提示---浮点异常(核心转储),在我查找了资料之后发现,这种错误一般发生在判断异常上,比如说上述的代码,在执行offset = offset % str.length();这句话时,如果字符串长度是0的话,就会产生错误,所以经过修改后,正确通过的代码如下:
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.length() == 0 || offset == 0)
{
return;
}
offset = offset % str.length();
char a;
for(int i = 0; i < offset; i++)
{
a = str[str.length() - 1];
for(int j = str.length() - 1; j > 0; j--)
{
str[j] = str[j - 1];
}
str[0] = a;
}
};
这样修改就解决了上述问题,测试举例:
字符串str:timelimiterror offset:1000000000
得出的结果为:terrortimelimi
2018/1/23