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

LeetCode刷题时while循环j=-1不执行,j=0正常的原因?

问题分析:循环初始化j=-1时不执行的原因

在解决LeetCode每日一题《Count Subarrays With Fixed Bounds》时,我编写了如下非正确解法代码:

class Solution {
public:
    long long countSubarrays(vector<int>& nums, int minK, int maxK) {
        int  j = -1;
        int mintillnow = INT_MAX;
        int maxtillnow = INT_MIN;
        long long  count = 0;
        
        while(j < nums.size()){
            cout<<"why not running"<<endl;
            j++;
            mintillnow = min(nums[j],mintillnow);
            maxtillnow = max(nums[j],maxtillnow);
            if(mintillnow==minK && maxtillnow == maxK){
                count++;
            }
            if(mintillnow<minK || maxtillnow>maxK){
               mintillnow = INT_MAX;
               maxtillnow = INT_MIN;
            }
        }

        return count;
    }
};

问题:当我初始化j=-1时,循环完全不执行直接返回count;但初始化j=0时循环能正常运行,请问这是为什么?

原因解析

核心问题出在有符号整数和无符号整数的比较规则:

  • vector::size()返回的是size_t类型,这是一个无符号整数类型,值永远是非负的。
  • 当你把有符号整数int j=-1和size_t类型的nums.size()比较时,C++会自动将有符号的j转换为无符号类型。-1转成无符号后会变成该类型的最大值(比如64位系统下是18446744073709551615),这个值远大于正常数组的长度,因此j < nums.size()的条件直接不成立,循环根本不会进入。
  • 当j=0时,0作为有符号整数转成无符号后还是0,只要数组长度大于0,0 < nums.size()就成立,循环正常执行。

解决建议

要么将循环变量j的类型改为size_t,要么在比较时显式转换类型,比如:

while((size_t)j < nums.size())

不过更稳妥的方式是直接使用和容器索引匹配的无符号类型变量,避免类型转换带来的意外问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:25:08