牛客算法基础noob69 最厉害的学生

题目描述

给定N名学生的信息,包含:

  • 姓名s(仅含小写字母,长度不超过8)
  • 语文、数学、英语成绩c1, c2, c3(均为整数,0 ≤ ci ≤ 150)

定义总分T = c1 + c2 + c3。要求找出总分最大的学生信息;若总分相同,则取输入顺序靠前的学生。

输入格式:

  • 第一行:整数N(1 ≤ N ≤ 1000)
  • 接下来N行:每行包含字符串s和三个整数c1, c2, c3,表示学生姓名及三门成绩

输出格式:

  • 输出一行:姓名s及对应成绩c1, c2, c3,以空格分隔
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 1. 读取学生总数N
        int N = scanner.nextInt();
        
        // 2. 读取第一个学生的信息,作为初始最优值(避免初始值错误)
        String bestName = scanner.next();          // 最优学生姓名
        int bestC1 = scanner.nextInt();            // 最优学生语文成绩
        int bestC2 = scanner.nextInt();            // 最优学生数学成绩
        int bestC3 = scanner.nextInt();            // 最优学生英语成绩
        int bestTotal = bestC1 + bestC2 + bestC3;  // 最优学生总分
        
        // 3. 遍历剩余N-1个学生(从第2个到第N个)
        for (int i = 1; i < N; i++) {
            // 读取当前学生的信息
            String currName = scanner.next();
            int currC1 = scanner.nextInt();
            int currC2 = scanner.nextInt();
            int currC3 = scanner.nextInt();
            int currTotal = currC1 + currC2 + currC3;  // 当前学生总分
            
            // 比较当前学生与最优学生的总分
            if (currTotal > bestTotal) {
                // 若当前总分更高,更新所有最优信息
                bestName = currName;
                bestC1 = currC1;
                bestC2 = currC2;
                bestC3 = currC3;
                bestTotal = currTotal;
            }
            // 若总分相等:不更新(保留输入顺序更早的最优学生)
        }
        
        // 4. 输出结果(姓名 + 三门成绩,空格分隔)
        System.out.printf("%s %d %d %d", bestName, bestC1, bestC2, bestC3);
        
        scanner.close();
    }
}

盲点:不知道printf的使用方法

题目中要理解 System.out.printf("%s %d %d %d", bestName, bestC1, bestC2, bestC3); 为什么能这么写,核心是搞懂 printf 格式化输出的 “规则”—— 它靠 “格式字符串” 和 “参数列表” 的一一对应、类型匹配来实现精准输出,就像 “按模板填内容” 一样。

先拆解 printf 的两个核心部分

printf 方法的语法是:System.out.printf(格式字符串, 参数1, 参数2, ..., 参数N);

它的逻辑是:用 “参数列表” 里的值,按 “格式字符串” 规定的类型和样式,填充到对应的位置,最后输出完整内容

对应到你的代码:

  • 格式字符串"%s %d %d %d"(告诉程序 “要输出 4 个数据,分别按字符串、整数、整数、整数的格式,用空格分隔”);
  • 参数列表bestName, bestC1, bestC2, bestC3(要填充到格式字符串里的具体数据)。

逐个解释格式字符串里的 “密码”:%s 和 %d

格式字符串里的 %s%d 不是随便写的,它们是 “格式说明符”—— 专门用来匹配后面参数的 “类型”,告诉程序 “这个位置要填什么类型的数据”。

格式说明符对应的数据类型作用
%s字符串(String)把参数按照“字符串原样”输出
%d整数(int/long)

把参数按照“十进制整数”输出

比如我的代码里:

  • 第一个格式符 %s → 专门匹配第一个参数 bestName(String 类型,比如 “bob”),输出时会把 “bob” 原样显示;
  • 第二个格式符 %d → 匹配第二个参数 bestC1(int 类型,比如 95),输出时显示 “95”;
  • 第三个 %d → 匹配 bestC2(比如 95),输出 “95”;
  • 第四个 %d → 匹配 bestC3(比如 95),输出 “95”。

注:也可以在print里面用就 “+” 直接拼接在一起

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值