这是问题:
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秒的时间。
答案 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。