您的位置:首页 > 其它

LeetCode 189. Rotate Array(旋转数组)

2016-05-04 01:22 561 查看
原题网址:https://leetcode.com/problems/rotate-array/

Rotate an array of n elements to the right by k steps.

For example, with n = 7 and k = 3, the array
[1,2,3,4,5,6,7]
is
rotated to
[5,6,7,1,2,3,4]
.

Note:

Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.

[show hint]

Related problem: Reverse Words in a String II
方法一:使用临时空间。

public class Solution {
public void rotate(int[] nums, int k) {
k = k % nums.length;
if (k == 0) return;
int[] buf = new int[k];
for(int i=0; i<k; i++) buf[i] = nums[nums.length-k+i];
for(int i=nums.length-1; i>=k; i--) nums[i] = nums[i-k];
for(int i=0; i<k; i++) nums[i] = buf[i];
}
}


方法二:逐个向前推移,直到所有元素都在目标位置。

public class Solution {
private int gcd(int a, int b) {
if (a < b) {
int t = a;
a = b;
b = t;
}
while (b > 0) {
int t = a % b;
a = b;
b = t;
}
return a;
}
public void rotate(int[] nums, int k) {
k = k % nums.length;
int g = gcd(nums.length, k);
int l = nums.length * k / g;
for(int i=0; i<g; i++) {
int last = nums[(i+k)%nums.length];
for(int j=0; j<l; j+=k) {
int next = nums[(i+j+k)%nums.length];
nums[(i+j+k)%nums.length] = last;
last = next;
}
nums[(i+k)%nums.length] = last;
}
}
}


方法三:翻转。

public class Solution {
private void reverse(int[] nums, int from, int to) {
while (from < to) {
nums[from] ^= nums[to];
nums[to] ^= nums[from];
nums[from] ^= nums[to];
from ++;
to --;
}
}
public void rotate(int[] nums, int k) {
k = k % nums.length;
reverse(nums, 0, nums.length-k-1);
reverse(nums, nums.length-k, nums.length-1);
reverse(nums, 0, nums.length-1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: