Java 优化阵列法
我的方法很有效,但显然对于Hackerrank来说,处理大数字的速度不够快。我如何优化它?n是数组大小,k是数组元素向左旋转的次数Java 优化阵列法,java,arrays,optimization,Java,Arrays,Optimization,我的方法很有效,但显然对于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++)
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;
}
公共静态int[]arrayLeftRotation(int[]a,int-n,int-k){
int[]持有人=新的int[n];
对于(int m=0;m您可以执行如下操作
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;
}
公共静态int[]arrayLeftRotation(int[]a,int-n,int-k){
int[]b=新的int[n]
对于(int i=0;i我更愿意用实现它,您可以用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;
}
您还可以在一行中使用类似的
您必须使用数组吗?您可以使用Deque
从头部移除元素并将其添加到尾部。如果您需要数组,那么您可能应该将其视为圆形,并使用指向“第一个”的指针元素,并在旋转数组时移动指针。参数需要保持不变,我需要返回一个数组。如果您需要使用数组,我不认为您的代码需要优化可能与系统#arrayCopy
或数组#copyOfRange
类似的方法可以优化您的方法,如果其中任何一种方法你是内在的。否则我会坚持斯汀派克的答案,因为它只是O(n)而不是O(nk)。是的,斯汀派克的答案是最好的。我从一个类似O(n^2)的while循环lol开始。没想到会有O(n)太多了shorter@Bloodluster..为了优化,它必须更快,而不是更短。欢迎来到SO。如果你发现任何有帮助的答案,你可以投票/接受它。你能将其与StinePike的答案进行比较吗?我很好奇,看看是否有什么不同。
public static int[] arrayLeftRotation(int[] a, int k) {
return IntStream.range(0, a.length).map(i -> a[(i + k) % a.length]).toArray();
}