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
相关产品推荐
相关产品推荐

