1.题目
给你一个数组,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。、
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
2.分析
本题关键在于k对数组的影响,k的值为数组长度的偶数倍时或当k为0时,输出原样数组,当k的值为奇数倍时,则将数组反转。当k>nums.length时需要将k的值,转化到0<k<nums.length范围内,并向找到对应的数组下表并将后的值向前存放。
public static void rotate(int[] nums, int k) {
List<Integer> arr = new ArrayList<>();
boolean flag = false;
if (k > nums.length) {
if ( ((float)k / nums.length) % 2 == 0) {
k = 0;
} else if ( ((float)k / nums.length) % 3 == 0) {
k = 0;
flag = true;
}
else {
k =nums.length- k % (nums.length);
}
}
else if(k>0) {
k = nums.length - k;
}else {
k=0;
}
int count =0;
while (count !=nums.length ){
arr.add(count++,nums[k++]);
if (k == nums.length) {
k = 0;
}
}
if (flag == true){
Collections.reverse(arr);
}
for (int i=0;i<arr.size();i++){
nums[i]= arr.get(i);
}
System.out.println(arr);
}
该方法很垃圾,不介意采用。可以使用循环链表的思路解决该题