@XQF
2018-03-07T14:56:23.000000Z
字数 1391
阅读 1217
数据结构与算法
第一次做的时候当时认为简单,。没想到%起来花了一点时间
这类变形题会求移动后的数组或者,。移动后的各种索引
发现规律,从第0项开始后移K位。取余的方式进行length次就可以完成任务了。关键是要交换数值的过程中一定要先保留数据,。,再进行操作。上过好几次当了。这种方式我也觉得k没必要进行限制,要限制的话直接加上就是了。
public class Solution {public int[] shiftK(int[] nums, int k) {if (nums == null || nums.length == 0 || k < 0) {return null;}System.out.println(Arrays.toString(nums));int len = nums.length;int index = 0;int p = nums[index];for (int i = 0; i < len; i++) {index = (index + k) % len;int q = nums[index];nums[index] = p;p = q;}System.out.println(Arrays.toString(nums));return nums;}public static void main(String[] args) {Solution solution = new Solution();int[] nums = {2, 0, 3, 5, 2, 1, 3, 4, 2, 4, 2};solution.shiftK(nums, 3);}}
序列12345678右移两位变成序列78123456,可以看作经过了以下几个步骤
真是有意思哈哈
public class Solution {public int[] shiftK(int[] nums, int k) {System.out.println(Arrays.toString(nums));int len = nums.length;k = k % len;//这里的right要根据12345678这个实例来具体判断reserve(nums, 0, len - 1 - k);reserve(nums, len - k, len - 1);reserve(nums, 0, len - 1);System.out.println(Arrays.toString(nums));return nums;}public void reserve(int[] nums, int left, int right) {while (left < right) {int temp = nums[left];nums[left] = nums[right];nums[right] = temp;left++;right--;}}public static void main(String[] args) {Solution solution = new Solution();int[] nums = {2, 0, 3, 5, 2, 1, 3, 4, 2, 4, 2};solution.shiftK(nums, 3);}}
