我的方法有效,但显然对于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;
}
答案 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;
}
答案 1 :(得分:1)
我希望使用System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
来实现此功能,您可以将n
替换为src.length
。像,
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();
}