(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%=nslices.Reverse(nums)slices.Reverse(nums[:k])slices.Reverse(nums[k:])
}