深入解析:【代码】(LeetCode 面试经典 150 题 ) 189. 轮转数组(字符串、双指针)
题目:189. 轮转数组
思路:移动k次,等价于移动 k%n次,那就是最后面的k个字符会被放置在最前面。
将字符串nums翻转,那么就可以将后面k个字符放置在最起码,但是两边的字符串都乱序了。两边再翻转一次就正序了。细节看源码,时间复杂度0(n)。
字符串翻转,用双指针即可实现,Java版本题解有。
C++版本:
class Solution
{
public:
void rotate(vector<
int>
& nums, int k) {
int n=nums.size();
k%=n;
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k,nums.end());
}
};
JAVA版本:
class Solution
{
void reverse(int[] nums,int l,int r){
while(l<r){
int tmp=nums[l];
nums[l]=nums[r];
nums[r]=tmp;
l++;
r--;
}
}
public void rotate(int[] nums, int k) {
int n=nums.length;
k%=n;
reverse(nums,0,n-1);
reverse(nums,0,k-1);
reverse(nums,k,n-1);
}
}
Go版本:
func rotate(nums []int, k int) {
n:=len(nums)
k%=n
slices.Reverse(nums)
slices.Reverse(nums[:k])
slices.Reverse(nums[k:])
}