【问题标题】:Rotate an elements in an array between a specified range在指定范围之间旋转数组中的元素
【发布时间】:2020-06-04 09:26:22
【问题描述】:

我有一个数组:

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

【问题讨论】:

    标签: java arrays rotation array-algorithms


    【解决方案1】:

    按指定步长在指定范围内旋转数组中的元素:

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

    另见:Rotating an int Array in Java using only one semicolon

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多