LeetCode 1833题使用while循环出现有符号整数溢出问题求助
问题分析:整数溢出与逻辑错误
核心错误点
1. 返回值完全错误
你的代码最后返回的是coins,但题目要求返回最多能购买的冰淇淋数量,正确返回值应为count。这会直接导致输出结果不符合预期,同时也是后续溢出问题的间接诱因。
2. 整数溢出问题
原因:
coins被声明为int类型,虽然初始coins最大值1e8在32位int的范围(-2^31 ~ 2^31-1)内,但你的循环逻辑会在余额不足时仍执行减法操作:
当while(coins > 0 && i < costs.size()) { count++; coins -= costs[i]; // 即使coins < costs[i],仍会执行减法 i++; }coins减去costs[i]后变为负数,若继续多次执行减法,数值会超出int的最小值范围,触发有符号整数溢出(C++未定义行为)。溢出后的coins可能绕回成正数,导致循环条件coins>0再次成立,循环持续执行,进一步加剧溢出,最终触发UndefinedBehaviorSanitizer的报错。- 错误提示中的
1094795588 - -1094795586是溢出后的异常数值表现:coins溢出为负数后,再次执行减法时,实际是负数减正数,又一次溢出变成正数,导致出现看似荒谬的“减负数”运算(本质是溢出后的数值解析错误)。
3. 循环逻辑错误
循环先执行count++再扣除金额,会导致余额不足时仍多算一个冰淇淋。比如coins=2、当前冰淇淋价格为3时,代码会先把count加1,再将coins变为-1,这显然不符合题意(买不起的冰淇淋不能计入数量)。
对比for循环正常的原因
正常的for循环逻辑是先判断余额是否足够购买当前冰淇淋,再执行购买操作,例如:
int count = 0; sort(costs.begin(), costs.end()); for(int i=0; i<costs.size() && coins >= costs[i]; i++){ count++; coins -= costs[i]; } return count;
这种逻辑下,只有余额足够时才会扣除金额,coins不会出现负数,自然不会触发溢出问题。
修复方案
- 将剩余金额改为
long long类型存储,避免溢出; - 修正循环逻辑,先判断余额是否足够再执行购买操作:
class Solution { public: int maxIceCream(vector<int>& costs, int coins) { long long remaining = coins; int count = 0; sort(costs.begin(), costs.end()); int i = 0; while(i < costs.size() && remaining >= costs[i]){ count++; remaining -= costs[i]; i++; } return count; } };
内容的提问来源于stack exchange,提问作者Ojaswi Awasthi
相关产品推荐
相关产品推荐

