[关闭]
@XQF 2018-03-07T14:56:23.000000Z 字数 1391 阅读 1126

如何把一个数组循环右移k位?

数据结构与算法


第一次做的时候当时认为简单,。没想到%起来花了一点时间

这类变形题会求移动后的数组或者,。移动后的各种索引

1.首发--自己动手丰衣足食

发现规律,从第0项开始后移K位。取余的方式进行length次就可以完成任务了。关键是要交换数值的过程中一定要先保留数据,。,再进行操作。上过好几次当了。这种方式我也觉得k没必要进行限制,要限制的话直接加上就是了。

  1. public class Solution {
  2. public int[] shiftK(int[] nums, int k) {
  3. if (nums == null || nums.length == 0 || k < 0) {
  4. return null;
  5. }
  6. System.out.println(Arrays.toString(nums));
  7. int len = nums.length;
  8. int index = 0;
  9. int p = nums[index];
  10. for (int i = 0; i < len; i++) {
  11. index = (index + k) % len;
  12. int q = nums[index];
  13. nums[index] = p;
  14. p = q;
  15. }
  16. System.out.println(Arrays.toString(nums));
  17. return nums;
  18. }
  19. public static void main(String[] args) {
  20. Solution solution = new Solution();
  21. int[] nums = {2, 0, 3, 5, 2, 1, 3, 4, 2, 4, 2};
  22. solution.shiftK(nums, 3);
  23. }
  24. }

2.比较有意思的解法

序列12345678右移两位变成序列78123456,可以看作经过了以下几个步骤

  1. 子序列123456逆序--->654321,原序列12345678--->65432178
  2. 子序列78逆序--->87,原序列65432178--->65432187
  3. 最后整体逆序,65432187--->78123456

真是有意思哈哈

  1. public class Solution {
  2. public int[] shiftK(int[] nums, int k) {
  3. System.out.println(Arrays.toString(nums));
  4. int len = nums.length;
  5. k = k % len;
  6. //这里的right要根据12345678这个实例来具体判断
  7. reserve(nums, 0, len - 1 - k);
  8. reserve(nums, len - k, len - 1);
  9. reserve(nums, 0, len - 1);
  10. System.out.println(Arrays.toString(nums));
  11. return nums;
  12. }
  13. public void reserve(int[] nums, int left, int right) {
  14. while (left < right) {
  15. int temp = nums[left];
  16. nums[left] = nums[right];
  17. nums[right] = temp;
  18. left++;
  19. right--;
  20. }
  21. }
  22. public static void main(String[] args) {
  23. Solution solution = new Solution();
  24. int[] nums = {2, 0, 3, 5, 2, 1, 3, 4, 2, 4, 2};
  25. solution.shiftK(nums, 3);
  26. }
  27. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注