@XQF
2018-03-07T14:56:23.000000Z
字数 1391
阅读 1126
数据结构与算法
第一次做的时候当时认为简单,。没想到%起来花了一点时间
这类变形题会求移动后的数组或者,。移动后的各种索引
发现规律,从第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);
}
}