一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。
输入在第一行给出一个正整数N(≤104)。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。
在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。
7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62
22 Amy
这有一个我自己都觉得很蠢的错误,当我使用以下的代码去运行输入数据时
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() 调用,以消耗掉整数后的换行符。
在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]);
}
}