时间上的操纵不够快吗?

时间:2019-11-06 17:03:25

标签: time-complexity bitwise-xor onlinejudge

这是问题:

  

https://practice.geeksforgeeks.org/problems/find-the-odd-occurence/0

     

给出一个正整数数组,其中所有数字均出现偶数   除出现奇数次的一个数外的其他次数。   找到号码。


输入范围为

  

1≤T≤100:测试用例
  1≤N≤107:输入数量
  1≤A [i]≤106:输入


示例:

Input:

1
5
8 4 4 8 23

Output:

23

这是代码:

class GFG
 {
    public static void main (String[] args)
     {
     //code
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        while(t-->0){
              int N = sc.nextInt();
              int count = 0;
              for(int j = 0; j<N; j++){
                  int in = sc.nextInt();
                 count =count^in;
              }
              System.out.println(count);
        }

    }
}

我的问题是,OJ花费了 2.5s 来执行它,其他人比我花费的时间要少得多。有些人在 0.3s 中做到了。这还包括将数字输入数组,然后遍历它们。


这是为什么,是因为OJ还是什么原因,我没有得到? 我也提交了几次提交意见书,只是为了确定是否有故障,但始终花费超过2.5秒的时间。

1 个答案:

答案 0 :(得分:2)

如果您编写优化的代码,现代Java被认为是相当快的,但是它仍然比在更低级别进行交互并且具有提前编译器的语言慢。无论如何,这个主题在这里有一个很好的详尽答案:Is Java really slow?

但是,仍然可以通过使用BufferedReader而不是直接使用Scanner来优化Java代码。 Scanner实际上接受输入流,然后根据我们尝试获取的数据类型进行解析,但是BufferedReader仅提供原始输入,不执行任何操作。因此,如果您使用它并分别解析原始输入行,那么对您的代码运行时会更好。使用BufferedReader,经过稍微修改的代码,我可以得到0.61s:

import java.util.*;
import java.io.*;
class gfg
{
    public static void main(String args []) throws IOException
    {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw=new PrintWriter(System.out, true);
        int t=Integer.parseInt(br.readLine());
        while(t-->0)
        {
            int N = Integer.parseInt(br.readLine());
            String str[]=br.readLine().split(" ");
            int count = 0;
            for(int j = 0; j<N; j++){
                int in = Integer.parseInt(str[j]);
                count =count^in;
              }
              System.out.println(count);
        }

    }
}

我认为,通过更多的优化,您可能可以使时间几乎等于0.3s。