【问题标题】:Optimizing arrayRotateLeft method优化 arrayRotateLeft 方法
【发布时间】:2017-04-07 12:17:06
【问题描述】:

我的方法有效,但显然对于 Hackerrank 而言,它在处理大数字时不够快。我该如何优化它? n 是数组大小,k 是数组元素应该向左旋转的次数。

 public static int[] arrayLeftRotation(int[] a, int n, int k) {
        int[] holder = new int[n];
        for(int m=0; m<k; m++)
            {
      for(int b = 0; b<n; b++)
          {
          if(b==0) holder[n-1]=a[b];
          else holder[b-1]=a[b];
          }
          a = holder;
          holder = new int[n];
        }
        return a;
    }

【问题讨论】:

  • 一定要用数组吗?您可以使用Deque 并从头部删除元素并将其添加到尾部。如果您需要一个数组,那么您可能应该将其视为循环并有一个指向“第一个”元素的指针,并在旋转数组时移动指针。
  • 那么参数需要保持不变,我需要返回一个数组。
  • 如果你需要使用数组,我认为你的代码不需要优化
  • 如果这些方法中的任何一个是内在的,那么可能类似于System#arrayCopyArrays#copyOfRange 的方法可以优化您的方法。否则我会坚持使用 StinePike 的答案,因为它只是 O(n) 而不是 O(nk)。
  • 是的,StinePike 的回答是最好的。我从一个类似于 O(n^2) 的 while 循环开始。没想到会有 O(n) 的解决方案。

标签: java arrays optimization


【解决方案1】:

您可以执行以下操作

public static int[] arrayLeftRotation(int[] a, int n, int k) {
    int[] b = new int[n]
    for(int i = 0; i<n; i++)
        b[i] = a[(i+k)%n]
    return b;
}

【讨论】:

  • 大坝短得多
  • @Bloodluster .. 优化必须更快,而不是更短。欢迎来到 SO。如果您发现任何答案有帮助,您可以投票/接受。
【解决方案2】:

我更喜欢用System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 来实现它,你可以用src.length 替换n。类似的,

public static int[] arrayLeftRotation(int[] src, int k) {
    int[] dest = new int[src.length];
    System.arraycopy(src, k, dest, 0, src.length - k);
    System.arraycopy(src, 0, dest, src.length - k, k);
    return dest;
}

您也可以将@StinePike 提出的解决方案与IntStream 类似

public static int[] arrayLeftRotation(int[] a, int k) {
    return IntStream.range(0, a.length).map(i -> a[(i + k) % a.length]).toArray();
}

【讨论】:

  • 您能否将其与 StinePike 的答案进行对比?我很想知道有什么不同。
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2012-05-07
  • 1970-01-01
相关资源
最近更新 更多