【问题标题】:Suggest performance improvement for rotation of array with given no of steps of rotation建议在没有旋转步数的情况下提高阵列旋转的性能
【发布时间】:2021-09-23 04:40:07
【问题描述】:

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

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

输出:
4 5 1 2 3

整个问题陈述可在互联网上找到,标题为 - Monk and Rotation

所以,我的代码在 5 个测试用例中运行良好,但在 1 个测试用例中因超过时间限制而失败。我尝试更改scanner 类并使用bufferedreader 和输入流阅读器来加快输入阅读速度,但仍然没有运气。下面是代码,请提出可以改进的地方。

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

【问题讨论】:

    标签: java arrays sorting java-8 bufferedreader


    【解决方案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

    【讨论】:

    • 成功了,谢谢!
    【解决方案2】:

    最后一个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;
         }
    

    【讨论】:

      猜你喜欢
      • 2015-11-18
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 2021-02-16
      相关资源
      最近更新 更多