蓝桥杯 算法提高 彩票 Scanner nextInt()的效率问题

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]++;
        }
    }

}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_35040169/article/details/79700540