将数组旋转k



给定一个数组和一个数字k,我们必须将数组旋转k次。

Sample Input
1            //number of of testcases 
5 2          //5(array size) 2(K value)
1 2 3 4 5    /array elements
Sample output
4 5 1 2 3

这是我的代码

import java.util.*;
class TestClass {
public static void main(String args[] ) throws Exception {
// Write your code here
Scanner input=new Scanner(System.in);
int testcases=input.nextInt();
for(int i=0;i<testcases;i++)
{
int size=input.nextInt();
int rotationNo=input.nextInt();
rotateArray(size, rotationNo, input);
}
}
public static void rotateArray(int size, int rotationNo, Scanner input)
{
int[] arr=new int[size];
int[] result=new int[size];
rotationNo=rotationNo%size;
for(int i=0;i<size;i++)
{
arr[i]=input.nextInt();
}
int resultIndex=0;
int index=size-rotationNo;
int k=index,t=0,track=0;
while(true)
{
if(k<size)
{
System.out.print(arr[k++]+" ");
++track;
if(track==size)
{
break;
}
else
{
continue;
}
}
if(t<index)
{
if(t==(index-1))
{
System.out.print(arr[t++]);
}
else
{    
System.out.print(arr[t++]+" ");
}
++track;

if(track==size)
{
break;
}
else
{
continue;
}
}
}
System.out.println();
}
}

这个问题是在一次编程竞赛中提出的。我的所有测试用例都通过了,只有一个显示超出了时间限制。但是我不明白是什么原因导致了时间的限制。循环总是会停止任何测试用例。我的代码的时间复杂度是O(n(。还有其他更好、更有效的解决方案吗?

一旦读取并存储了k个值,就开始直接输出输入(即不存储(
然后输出最初读取和存储的k值。

数组内部的移位,就是这里的相关操作
完成的换档次数越少(如果执行正确,换档距离在这里并不重要(越好。它包括向数组存储和从数组检索。我认为,如果在没有任何处理的情况下进行读取和输出,则可以忽略不计。也就是说,我专注于转变。

严格来说,读取和输出是处理过程,这意味着无法计算O((的改进。

但请允许我忽略对改进的O((估计的读取和输出:

所提出的建议将提高从O(n(到O(k(的转换期间的阵列访问次数。诚然,这里忽略了阅读和输出。这里避免了从数组中存储和检索,尤其是数组内部的移位,这就是与这里相关的O(k(部分
因此相关运算为O(k(,忽略O(1(中的n-k值。

类似的测试用例

1
10000 1
1 2 3 4 5 6 7 8 ...

将容易地消除在读取之后和输出之前进行O(4*10000)的程序,即存储全部、读取和写入全部用于移位,然后读取全部用于输出。与仅存储单个值并再次读取以在最后输出的O(2*1)相比
(是的,我知道clean O((分析不使用因子或任何数字。我希望你仍然能理解要点

以下是一个代码建议(简化为单个测试用例(:

import java.util.*;
public class Test {
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
int testcases= input.nextInt(); //ignored, assuming 1
int size     = input.nextInt();
int rotation = input.nextInt();
int i=0;
int[] newArr = new int[rotation%size]; //small array
// based on the nice idea by User-Upvotedon'tsayThanks

for(; i<rotation%size; i++)
{
newArr[i] = input.nextInt(); // few write accesses
}
for(; i<size; i++)
{
System.out.println( input.nextInt()); //many direct outpots
}
for(i=0; i<rotation%size; i++)
{
System.out.println(newArr[i]); // few outputs from array
}
return;
}
}

对于的输入:

1
5 2
1 2 3 4 5

它会给你一个输出:

3
4
5
1
2

需要输入的模数输出相同:

1
5 7
1 2 3 4 5

我在下面提供了一个解决方案,它将直接输出扫描仪输入,直到满足输入的大小。它有一个恒定的输入时间o(n(,但它只接触每个项目一次。并且避免使用while循环,否则while循环可能增加迭代的乘数。


public class Test {

public static void main(String[] args) {
int rotation = new Scanner(System.in).nextInt();
int size = new Scanner(System.in).nextInt();

int[] values = rotate(rotation, size, new Scanner(System.in));
for(int i : values){
System.out.println(i);
}
}
public static int[] rotate(int rotation, int size, Scanner input){
int[] newArr = new int[size];
for(int i = 0; i<size; i++){
int newPosition = i + rotation;
newPosition = newPosition >= size ? newPosition - size : newPosition;
newArr[newPosition] = input.nextInt();
}
return newArr;
}
}

最新更新