import java.util.*;
public class Main {
public static boolean isPrime(int n){
int count=0;
for(int i=2;i<=Math.sqrt(n);i++){
if(n%i==0){
count++;
break;
}
}
if(count==1) return false;
else return true;
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int N=Integer.parseInt(scan.nextLine());
String[] id=new String[N+1];
for(int i=1;i<=N;i++){
id[i]=scan.nextLine();
}
boolean[] checked=new boolean[N+1];
Arrays.fill(checked,false);
int query=Integer.parseInt(scan.next());
for(int i=1;i<=query;i++){
String ID=scan.next();
for(int j=1;j<=N;j++){
if(id[j].equals(ID)&&!checked[j]){
if(j==1) System.out.println(ID+":"+" Mystery Award");
else if(isPrime(j)) System.out.println(ID+":"+" Minion");
else System.out.println(ID+":"+" Chocolate");
checked[j]=true;
break;
}
else if(id[j].equals(ID)&&checked[j]) {
System.out.println(ID+": Checked");
break;
}
if(j==N) System.out.println(ID+": Are you kidding?");
}
}
}
}
我一开始想用BufferedReader来读取的,但是readline()读取不了末行 只能用效率很低的Scanner,请问有没有什么解决办法?
有好几个可以优化的地方
isPrime方法,可以不用变量,而且把算术平方根结果保存起来,防止重复计算,改成这样:
public static boolean isPrime(int n){
int temp=(int)Math.sqrt(n);
for(int i=2;i<=temp;i++){
if(n%i==0){
return false;
}
}
return true;
}
然后后面可以优化的就是33和40行都调用了equals,完全可以写到一起。这些细节都可以优化。
如果还过不了,用哈希表试试?
你应该用哈希表存储用户ID到相应名次的映射,这样查询时就比你用循环快很多。
既然id位数不超过4,完全可以预设0-9999的byte数组,用筛数法记录下所有的素数登记在数组中。这个8位的byte={a0,a1,...,a7},可以用a7代表是否为素数,a6代表有没有出现在名次里,a5代表有没有取过奖品,这样预处理后可以直接由id定位到指定元素,可能可以快一点