簡體   English   中英

在指定范圍之間旋轉數組中的元素

[英]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

按指定步長在指定范圍內旋轉數組中的元素:

  1. 將數組拆分為三部分: beforerangeafter

  2. 移動指定范圍的數組。

    2.1。 將此范圍分成兩部分: nearfar

    2.2. 交換它們並連接回來。

  3. 將所有內容連接回來。

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();
}

另請參閱:僅使用一個分號在 Java 中旋轉 int 數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM