LeetCode粉笔替换学生问题:我的Java解法测试用例失败求助
LeetCode 粉笔替换学生问题排查
问题描述
班级中有n名学生,编号从0到n-1。老师从学生0开始依次给学生布置题目,到学生n-1后重新从0开始循环。给定0索引的整数数组chalk和整数k,初始有k支粉笔。当给学生i布置题目时,其会使用chalk[i]支粉笔;若当前剩余粉笔数严格小于chalk[i],则该学生需要更换粉笔。返回需要更换粉笔的学生索引。
问题分析
你写的解法逻辑看似可行,但存在两个关键问题导致测试用例无法通过:
整数溢出:
代码中用int类型存储chalk_sum,但题目中chalk数组的元素最大值可达1e9,数组长度最多1e5,总和会远超int的最大值(约2e9),导致chalk_sum溢出变为负数,后续的条件判断、递归取模都会完全出错。条件判断逻辑错误:
你用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
相关产品推荐
相关产品推荐

