给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数
int[] arr = new int[]{1,2,3,4,5,6,7};
想移动5个位置
k = 5
我们可以先反转整个数组
然后再前后数据反转,如下图
先写个反转函数
public static void reverse(int[] arr,int start,int end){
//左小于右边,进行交换,直到左边大于等于右边才停止
while(start < end){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
再定义一个函数,此函数调用三次
k mod 数组长度等于要移动的位数
函数内的 k - 1 是因为要要取到在数组中第五位元素
调用三次,首先先反转数组
再将 k 左边和右边的元素反转
public static void route(int[] nums,int k){
k = k % nums.length;
//反转整个数组
reverse(nums,0,nums.length - 1);
//反转左边的
reverse(nums,0,k - 1);
//反转右边的
reverse(nums,k,nums.length - 1);
}
main方法调用route函数
遍历输出反转后的数组
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5,6,7};
//调用route函数
route(arr,5);
for (int i : arr) {
System.out.print(i + "\t");
}
}
输出
7,6,5,4,3,2,1
源代码如下
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5,6,7};
route(arr,5);
for (int i : arr) {
System.out.println(i);
}
}
public static void route(int[] nums,int k){
k = k % nums.length;
reverse(nums,0,nums.length - 1);
reverse(nums,0,k - 1);
reverse(nums,k,nums.length - 1);
}
public static void reverse(int[] arr,int start,int end){
while(start < end){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
本文详细讲解了如何通过反转策略,使用三个函数来实现在给定数组`arr`中元素向右移动k个位置的方法,适用于整数数组,如[1,2,3,4,5,6,7],当k=5时,最终输出为[7,6,5,4,3,2,1]。涉及到了数组反转和部分区域反转的技巧。
891

被折叠的 条评论
为什么被折叠?



