java - 在指定范围之间旋转数组中的元素
问题描述
我有一个数组:
int[] arr1 = {1, 2, 3, 4, 5, 6, 7, 8, 9};
我想将数组从指定范围旋转k
几次,即从第 5 个元素到最后一个元素:
output: {1, 2, 3, 4, 9, 8, 5, 6, 7}
我试图调整算法以从数组的开始旋转到结束
public static int[] rotate(int[] nums, int k) {
int[] a = new int[nums.length];
for (int i = 4; i < nums.length; i++) {
a[(i + k) % nums.length] = nums[i];
}
for (int i = 4; i < nums.length; i++) {
nums[i] = a[i + 4];
}
return nums;
}
但是,输出是:1 2 3 4 0 0 5 6 7
除了将原始数组中的目标元素复制到临时数组中然后运行该算法之外,我做错了什么?为什么0, 0
返回而不是9, 8
?
解决方案
按指定步长在指定范围内旋转数组中的元素:
将数组拆分为三个部分
before
:range
和after
。移动指定范围的数组。
2.1。将此范围分成两部分:
near
和far
。2.2. 交换它们并连接回来。
将所有内容连接回来。
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] rotated = rotateRange(arr, 4, arr.length, 3);
System.out.println(Arrays.toString(rotated));
// [1, 2, 3, 4, 8, 9, 5, 6, 7]
}
// rotate a specified range of an array by a specified step
static int[] rotateRange(int[] arr, int start, int end, int n) {
return Stream.of(
// three parts: 'before', 'range' and 'after'
Arrays.stream(arr, 0, start),
// get a specified range and rotate it by a specified step
Arrays.stream(rotate(Arrays.copyOfRange(arr, start, end), n)),
Arrays.stream(arr, end, arr.length))
// flatten into one stream
.flatMapToInt(Function.identity())
// return an array
.toArray();
}
// rotate an array by a specified step
static int[] rotate(int[] arr, int n) {
// prevent circular rotation
n = n % arr.length;
return IntStream.concat(
// concatenate the two parts: 'far' and 'near'
Arrays.stream(arr, n, arr.length),
Arrays.stream(arr, 0, n))
// return an array
.toArray();
}
推荐阅读
- julia - 如何在 Julia 中分解一个数字?
- r - 具有聚集列的 ggplot2
- reactjs - 如何监视在 componentDidMount 内部调用的方法
- entity-framework-core - 如果添加到上下文中保存更改
- r - 如何查找列表中的列表数量
- mysql - 如何使用 EJS 将 Node.js 中的下拉值发布到 MySQL 数据库?
- javascript - 如何删除字符串中出现多次的字符
- google-app-engine - AppEngine 的自定义服务帐户
- jquery - aboot jquery 单选按钮验证
- sql - 优化以下 postgreSQL 代码的可能方法是什么?