[英]Rotate an elements in an array between a specified range
我有一個數組:
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;
}
但是,output 是: 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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.