java获取系统输入中Scanner nextInt()和BufferedReader的效率问题
在做这道题的时候,我第一次是Scanner的nextInt()获取输入,然后提交时运算超时.
我看了下代码,因为输入的号码都是7个数的,所以时间复杂度大概就O(n)而已,那么为什么超时呢?我猜测是输入多行号码时(超过一百行时,就要执行700次的nextInt()方法,而IO操作是最占用时间的),每个号码都用一个nextInt()方法录入,非常耗时.
import java.util.Arrays;
import java.util.Scanner;
/**
*
* 算法提高 彩票
时间限制:1.0s 内存限制:256.0MB
问题描述
为丰富男生节活动,贵系女生设置彩票抽奖环节,规则如下:
1、每张彩票上印有7个各不相同的号码,且这些号码的取值范围为[1, 33];
2、每次在兑奖前都会公布一个由七个互不相同的号码构成的中奖号码;
3、共设置7个奖项,特等奖和一等奖至六等奖。兑奖规则如下:
特等奖:要求彩票上的7个号码都出现在中奖号码中;
一等奖:要求彩票上的6个号码出现在中奖号码中;
二等奖:要求彩票上的5个号码出现在中奖号码中;
……
六等奖:要求彩票上的1个号码出现在中奖号码中;
注:不考虑号码出现的顺序,例如若中奖号码为23 31 1 14 19 17 18,则彩票12 8 9 23 1 16 7由于其中有两个号码(23和1)出现在中
奖号码中,所以该彩票中了五等奖。
现已知中奖号码和李华买的若干彩票的号码,请你写一个程序判断他的彩票中奖情况。
输入格式
第一行一个正整数n,表示彩票数量,第二行7个整数,表示中奖号码,下面n行每行7个整数,描述n张彩票。
输出格式
7个空格隔开的数字,第1个数字表示特等奖的中奖张数,第2个数字表示一等奖的中奖张数,第3个数字表示二等奖的中奖张数……第7个数
字表示六等奖的中奖张数。
样例输入
3
1 2 3 4 5 6 7
11 12 13 14 15 16 17
12 13 14 15 16 17 18
8 7 10 9 31 30 29
样例输出
0 0 0 0 0 0 1
数据规模和约定
30%的数据n<=100;
70%的数据n<=1000;
100%的数据n<=100000。
提示:数组定义为全局变量,可以分配更多内存。
*
*/
public class Main {
private static int[] key = new int[7];
private static int n = 0;
private static int[] numbers = new int[7];
private static int[] prize = new int[7];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
key = new int[7];
for (int i=0; i<7; i++) {
key[i] = sc.nextInt();
}
for (int i=0; i<n; i++) {
for (int j=0; j<7; j++) {
numbers[j] = sc.nextInt();
}
f(key,numbers);
}
//System.out.println(Arrays.toString(key));
//System.out.println(Arrays.deepToString(numbers));
//
for (int i : prize) {
System.out.print(i+" ");
}
}
private static void f(int[] key, int[] number) {
int count =0; // 与彩票号码相同的号码数目
for (int j=0;j<7; j++) {
for (int k=0; k<7;k++ ) {
if(key[j] == number[k]) {
count ++;
}
}
}
// 中奖的时候,在其相关中奖的位置+1
if (count > 0) {
prize[7-count]++;
}
}
}
发现问题后,我改用BufferedReader读取每行的号码,最用循环将其逐个放入数组,终于不超时了.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
private static int[] key = new int[7];
private static int n = 0;
private static int[] numbers = new int[7];
private static int[] prize = new int[7];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
String[] keysArr = br.readLine().split(" ");
for (int i=0; i<7; i++) {
key[i] = Integer.parseInt(keysArr[i]);
}
for (int i=0; i<n; i++) {
String[] lineArr = br.readLine().split(" ");
for (int j=0; j<7; j++) {
numbers[j] = Integer.parseInt(lineArr[j]);
}
f(key,numbers);
}
//System.out.println(Arrays.toString(key));
//System.out.println(Arrays.deepToString(numbers));
//
for (int i : prize) {
System.out.print(i+" ");
}
}
private static void f(int[] key, int[] number) {
int count =0; // 与彩票号码相同的号码数目
for (int j=0;j<7; j++) {
for (int k=0; k<7;k++ ) {
if(key[j] == number[k]) {
count ++;
}
}
}
// 中奖的时候,在其相关中奖的位置+1
if (count > 0) {
prize[7-count]++;
}
}
}