Rotate Array
这题当然有很朴素的解法,例如利用k%nums.length
次循环每次循环都将原字符串向右推移1位,或者直接计算出每个字符最终所应该在的位置直接进行赋值。
那么这两种方法,前者复杂度太高,或者不够清晰简单。
我选用的是在编程珠玑中提到的翻转方法,比如我们的输入是[1,2,3,4,5,6,7]
和k = 3
,那么翻转需要如下三部:
- 翻转
[1,2,3,4]
部分,得到[4,3,2,1,5,6,7]
- 翻转
[5,6,7]
部分,得到[4,3,2,1,7,6,5]
- 翻转整个数组,得到
[5,6,7,1,2,3,4]
,也就是最终答案
可以看到这种方法,只要写一个翻转数组的函数,然后调用三次即可。
实现代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class Solution { public void rotate(int[] nums, int k) { if (nums.length == 0 || nums.length == 1 || k % nums.length == 0) return; k %= nums.length; int length = nums.length; reverse(nums, 0, length - k - 1); reverse(nums, length - k, length - 1); reverse(nums, 0, length - 1); }
private void reverse(int[] nums, int begin, int end) { for (int i = 0; i < (end - begin + 1) / 2; i++) { int temp = nums[begin + i]; nums[begin + i] = nums[end - i]; nums[end - i] = temp; } } }
|