You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode粉笔替换学生问题:我的Java解法测试用例失败求助

LeetCode 粉笔替换学生问题排查

问题描述

班级中有n名学生,编号从0到n-1。老师从学生0开始依次给学生布置题目,到学生n-1后重新从0开始循环。给定0索引的整数数组chalk和整数k,初始有k支粉笔。当给学生i布置题目时,其会使用chalk[i]支粉笔;若当前剩余粉笔数严格小于chalk[i],则该学生需要更换粉笔。返回需要更换粉笔的学生索引。

问题分析

你写的解法逻辑看似可行,但存在两个关键问题导致测试用例无法通过:

  1. 整数溢出:
    代码中用int类型存储chalk_sum,但题目中chalk数组的元素最大值可达1e9,数组长度最多1e5,总和会远超int的最大值(约2e9),导致chalk_sum溢出变为负数,后续的条件判断、递归取模都会完全出错。

  2. 条件判断逻辑错误:
    你用remaining_chalk - chalk_sum <= 0来判断是否返回当前学生,但这个逻辑不符合题目要求——当剩余粉笔刚好等于前i+1个学生的粉笔总和时,学生i是刚好能用完粉笔的,应该进入下一轮循环,而不是直接返回i。

修正后的代码

class Solution {
    public int chalkReplacer(int[] chalk, int k) {
        long totalChalk = 0;
        // 先计算一轮循环的总粉笔消耗量
        for (int num : chalk) {
            totalChalk += num;
        }
        // 取模减少循环次数,避免重复遍历多轮
        long remaining = k % totalChalk;
        // 遍历找到第一个粉笔不够用的学生
        for (int i = 0; i < chalk.length; i++) {
            if (remaining < chalk[i]) {
                return i;
            }
            remaining -= chalk[i];
        }
        // 理论上不会走到此处
        return -1;
    }
}

修正说明

  • 改用long类型存储总消耗量和剩余粉笔数,彻底避免整数溢出问题。
  • 先计算一轮总消耗,对k取模后再遍历,大幅减少不必要的循环次数。
  • 逐个检查剩余粉笔是否满足当前学生的用量,完全贴合题目描述的逻辑,判断更准确。

内容的提问来源于stack exchange,提问作者Aprikose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:44:52