L1-056 猜数字(Java)

发布时间:2024年01月20日

一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。

输入格式:

输入在第一行给出一个正整数N(≤104)。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。

输出格式:

在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。

输入样例:

7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62

输出样例:

22 Amy

解题思路

  1. 计算平均数的一半:首先,我们需要遍历所有玩家的猜测,将它们相加并计算平均数,然后取平均数的一半。在这里,只保留整数部分。
  2. 找出赢家:接下来,我们需要找出哪位玩家的猜测与平均数的一半最接近。这需要遍历每个玩家,计算他们的猜测和平均数一半之间的差的绝对值。最小的差值对应的玩家就是赢家。

解题过程中遇到的问题

这有一个我自己都觉得很蠢的错误,当我使用以下的代码去运行输入数据时

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        String[] name = new String[N];
        int[] score = new int[N];
        for (int i = 0; i < N; i++) {
            String[] guessGame = scanner.nextLine().split(" ");
            System.out.print(guessGame[0] +" " + guessGame[1]);
        }
    }
}

报错:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1

原因是:当使用 Scanner.nextInt() 后直接调用 Scanner.nextLine() 时,nextInt() 仅读取整数值,但不消耗整行中的换行符。因此,当随后调用 nextLine() 时,它会立即读取并返回换行符之前的内容(在这种情况下是空字符串),导致您的 guessGame 数组没有包含预期的两个元素。

需要在读取整数 N 后添加一个额外的 scanner.nextLine() 调用,以消耗掉整数后的换行符。

什么时候需要用到scanner.nextLine()?

在Java中,使用scanner.nextLine();来读取换行符通常是在处理用户输入时,尤其是在连续读取多种类型的输入(如整数、字符串等)时非常重要。这种情况通常出现在以下几种情景:

1. 在读取整数或其他数据类型后读取字符串:当你使用例如scanner.nextInt();或scanner.nextDouble();这样的方法读取非字符串类型的输入后,这些方法不会读取行尾的换行符(\n)。如果紧接着使用scanner.nextLine();来读取字符串,它会读取到之前输入后留下的换行符,并返回一个空字符串。为了避免这个问题,通常在读取完非字符串类型的数据后,先使用一次scanner.nextLine();来消耗掉这个换行符。

2. 在读取多行数据时:如果你需要读取多行数据,每行都用换行符分隔,那么使用scanner.nextLine();是合适的。它会读取直到下一个换行符之前的所有字符,包括空格,这对于处理多行字符串输入非常有用。

代码

Scanner版本

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        scanner.nextLine();
        String[] name = new String[N];
        int[] score = new int[N];
        int sum = 0;
        for (int i = 0; i < N; i++) {
            String[] guessGame = scanner.nextLine().split(" ");
            name[i] = guessGame[0];
            score[i] = Integer.parseInt(guessGame[1]);
        }
        for (int i = 0; i < score.length; i++) {
            sum+= score[i];
        }
        int result = sum/N/2;
        int minDifference = 0;
        int winner = 0;
        int minxiabiao = score[0];
        for (int i = 0; i < score.length; i++) {
            minDifference = Math.abs(result - score[i]);
            if(minxiabiao > minDifference){
                minxiabiao = minDifference;
                winner = i;
            }

        }
        System.out.println(result + " " + name[winner]);

    }
}

BufferedReader版本

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;



public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        String[] name = new String[N];
        int[] score = new int[N];
        int sum = 0;
        for (int i = 0; i < N; i++) {
            String[] guessGame = br.readLine().split(" ");
            name[i] = guessGame[0];
            score[i] = Integer.parseInt(guessGame[1]);
        }
        for (int i = 0; i < score.length; i++) {
            sum+= score[i];
        }
        int result = sum/N/2;
        int minDifference = 0;
        int winner = 0;
        int minxiabiao = score[0];
        for (int i = 0; i < score.length; i++) {
            minDifference = Math.abs(result - score[i]);
            if(minxiabiao > minDifference){
                minxiabiao = minDifference;
                winner = i;
            }

        }
        System.out.println(result + " " + name[winner]);


    }
}
文章来源:https://blog.csdn.net/Gracener/article/details/135711529
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。