Given a string(Given in the way of char array) and an offset, rotate the string by offset in place
. (rotate from left to right).
Example
Example 1:
Input: str="abcdefg", offset = 3
Output: str = "efgabcd"
Explanation: Note that it is rotated in place, that is, after str is rotated, it becomes "efgabcd".
Example 2:
Input: str="abcdefg", offset = 0
Output: str = "abcdefg"
Explanation: Note that it is rotated in place, that is, after str is rotated, it becomes "abcdefg".
Example 3:
Input: str="abcdefg", offset = 1
Output: str = "gabcdef"
Explanation: Note that it is rotated in place, that is, after str is rotated, it becomes "gabcdef".
Example 4:
Input: str="abcdefg", offset =2
Output: str = "fgabcde"
Explanation: Note that it is rotated in place, that is, after str is rotated, it becomes "fgabcde".
Example 5:
Input: str="abcdefg", offset = 10
Output: str = "efgabcd"
Explanation: Note that it is rotated in place, that is, after str is rotated, it becomes "efgabcd".
Challenge
Rotate in-place with O(1) extra memory.
Notice
offset >= 0
the length of str >= 0
思路:三段反转;
public class Solution {
/**
* @param str: An array of char
* @param offset: An integer
* @return: nothing
*/
public void rotateString(char[] str, int offset) {
if(str == null || str.length == 0 || offset <=0) return;
int n = str.length;
offset = offset%n; // here is important;
swap(str, 0, n-offset-1);
swap(str, n-offset, n-1);
swap(str, 0, n-1);
}
public void swap(char[] str, int start, int end) {
while(start<end) {
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
}