2017-04-07 83 views
2

我的方法的作品,但顯然是Hackerrank它與大數字打交道時的速度不夠快。我如何優化它? n是數組大小,k是數組元素應該旋轉的次數。優化arrayRotateLeft方法

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; 
    } 
+0

你必須使用一個數組?您可以使用'Deque'並從頭部移除元素並將其添加到尾部。如果你需要一個數組,那麼你應該把它當作圓形並有一個指針「第一」元素,並旋轉陣列時移指針。 –

+0

那麼參數需要保持不變,我需要返回一個數組。 – Bloodluster

+0

如果需要使用數組,我不認爲你的代碼需要優化 –

回答

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; 
} 
+0

壩這麼短得多 – Bloodluster

+0

@Bloodluster ..它必須是優化不短更快。歡迎來到SO。如果你發現任何有用的答案,你可以對它進行讚揚/贊同。 – stinepike

1

我寧願用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(); 
} 
+0

你能對照StinePike的答案嗎?我很好奇,看看有沒有什麼區別。 –