我使用位操作但速度不够快?是因为Scanner class吗?
I using bit manipulation but it isn't quick enough? Is it because of Scanner class?
这是问题:
https://practice.geeksforgeeks.org/problems/find-the-odd-occurence/0
Given an array of positive integers where all numbers occur even
number of times except one number which occurs odd number of times.
Find the number.
输入范围为
1 ≤ T ≤ 100 : Test Cases
1 ≤ N ≤ 107 : Number of inputs
1 ≤ A[i] ≤ 106 : Inputs
示例:
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 秒。
现代 Java 被认为是相当快的,如果你编写优化代码,但它仍然比在更低级别交互并具有提前编译器的语言慢。无论如何,这个主题在这里有一个非常详细的答案:Is Java really slow?.
但是您的 java 代码仍然可以通过使用 BufferedReader
而不是直接使用 Scanner
来优化。 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.3 秒相当。
这是问题:
https://practice.geeksforgeeks.org/problems/find-the-odd-occurence/0
Given an array of positive integers where all numbers occur even number of times except one number which occurs odd number of times. Find the number.
输入范围为
1 ≤ T ≤ 100 : Test Cases
1 ≤ N ≤ 107 : Number of inputs
1 ≤ A[i] ≤ 106 : Inputs
示例:
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 秒。
现代 Java 被认为是相当快的,如果你编写优化代码,但它仍然比在更低级别交互并具有提前编译器的语言慢。无论如何,这个主题在这里有一个非常详细的答案:Is Java really slow?.
但是您的 java 代码仍然可以通过使用 BufferedReader
而不是直接使用 Scanner
来优化。 Scanner
实际上接受一个输入流,然后根据我们尝试获取的数据类型进行解析,但是 BufferedReader
只是给你一个原始输入,不做任何操作。因此,如果您使用它并单独解析您的原始输入行,那么它对您的代码运行时来说会好得多。使用 BufferedReader
:
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.3 秒相当。