建议在给定旋转步数的情况下改进阵列旋转的性能

Suggest performance improvement for rotation of array with given no of steps of rotation

我正在解决 hacker-earth 上的一个问题,该问题是关于 右移 整数数组 x 旋转步长的。下面给出的是示例输入,输出:

输入:
测试用例 -- 1
[数组元素个数,旋转步数] -- 5 2
[数组中的元素] -- 1 2 3 4 5

输出:
4 5 1 2 3

整个问题陈述都可以在 Internet 上找到,标题为 - Monk and Rotation

因此,我的代码在 5 个测试用例中运行良好,但在超过时间限制的情况下,1 个测试用例失败。我尝试更改 scanner class 并使用 bufferedreader 和输入流 reader 以加快输入读取速度,但仍然没有成功。下面是代码,请提出可以做哪些改进。

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.*;
    import java.io.*;
    
    class TestClass {
        public static void main(String args[] ) throws Exception {
    
            int noOfElements,stepsOfRotation;
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int testCases = Integer.parseInt(br.readLine());        
            while(testCases!=0)
            {
                String firstLine=br.readLine();
                String[] parts=firstLine.split(" ");
    
                noOfElements=Integer.parseInt(parts[0]);
                stepsOfRotation=Integer.parseInt(parts[1]);
    
                int[] arr=new int[noOfElements];
                
                String secondLine=br.readLine();
                String[] arrayElements=secondLine.split(" ");
    
             for(int i=0;i<noOfElements;i++)
                {
                arr[i]=Integer.parseInt(arrayElements[i]);
                }
    
            stepsOfRotation %= noOfElements;  
    
            int result;
            for(int i=0;i<noOfElements;i++)
            {
                result=arr[(i+(noOfElements-stepsOfRotation))%noOfElements];
                System.out.print(result+" ");
            }
            System.out.println();
            testCases--;
            }
        }
    }

最后一个p不应该是result吗? 请让 IDE 格式化代码。并尽可能在第一次使用时声明变量。

代码本身没问题,虽然有点贵split

没有字符串数组也行:

     int pos = 0;
     for (int i=0; i<noOfElements; i++) {
         int pos2 = firstLine.indexOf(' ', pos);
         if (pos2 == -1) {
             pos2 = firstLine.length();
         }
         arr[i] = Integer.parseInt(firstLine.substring(pos, pos2);
         pos = pos2 + 1;
     }

我建议您开始使用 StringTokenizer 作为数组输入,使用 StringBuilder 来打印所有此类编码问题的输出。
这里我们有一个大的数据集作为输入和输出,所以总是建议使用上面的方法,因为 print 调用的次数越多,你的程序就越慢。
声明:

StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder("");

而不是打印每个元素,而是将它们附加到 StringBuilder sb

            for(int i=0;i<noOfElements;i++)
            {
                result=arr[(i+(noOfElements-stepsOfRotation))%noOfElements];
                sb.append(result).append(" ");
            }
            sb.append("\n");
            testCases--;
        }
        System.out.print(sb);

如果您不知道如何使用它们,请阅读 StringTokenizer