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

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不会出现负数,自然不会触发溢出问题。

修复方案

  1. 将剩余金额改为long long类型存储,避免溢出;
  2. 修正循环逻辑,先判断余额是否足够再执行购买操作:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:35:36