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

在‘加一’算法问题中size_t与int的区别:为何该方案用size_t替代int会失效?

为什么用size_t替代int会导致“加一”代码失效?

问题背景

“加一”问题描述:给定一个以整数数组digits形式表示的非负大整数,数组中每个元素digits[i]对应该整数的第i位数字,数字从左到右按最高位到最低位排序,且无前导零。要求将该大整数加一,并返回结果数字数组。

原C++解决方案代码:

vector<int> plusOne(vector<int>& digits) {
    int n = digits.size();
    for (int i = n - 1; i >= 0; i--){
        if (digits[i] < 9){
            digits[i]++;
            return digits;
        }
        else{
            digits[i] = 0;
        }
    }
    digits.insert(digits.begin(), 1);
    return digits;
}

问题:为何在上述解决方案的for循环中,使用size_t类型替代int类型会导致代码无法正常工作?

原因分析

  • size_t是无符号整数类型:C++里std::vector::size()返回的size_t属于无符号整数范畴,它的取值只能是非负数,不存在负数值。
  • 循环终止条件彻底失效:如果把循环变量i改成size_t类型,当i从n-1开始递减,直到i变为0后再执行i--,由于无符号数不能为负,此时i会触发溢出回绕,变成size_t类型能表示的最大值(比如64位系统下是18446744073709551615)。而i >= 0这个条件对无符号数来说永远成立,循环会无限执行,根本停不下来。
  • 触发数组越界的未定义行为:当i变成极大值后,访问digits[i]会直接超出数组的有效索引范围,程序可能崩溃、输出错误结果,或者出现其他不可预测的行为。

举个直观的例子:如果数组长度为1,i初始值是0,第一次循环执行完i--后,无符号的i会变成最大值,此时i >=0依然成立,循环继续,访问digits[i]就会越界。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:11:49