LeetCode 统计数组中含偶数位数元素个数的C语言解法问题排查与优化求助
解决LeetCode偶数位数元素计数问题的代码优化
我来帮你排查代码里的问题,你遇到的测试用例失败主要源于两个关键错误,咱们一步步拆解并修复:
问题1:for循环中重复递增索引i
你的findNumbers函数里,for循环本身已经有i++的逻辑,但你在if和else分支里又手动执行了i++,这会导致每次循环i实际增加2,直接跳过了一半的元素。比如测试用例[555,901,482,1771],代码只会处理索引0和2的元素(555和482),完全漏掉了901和1771,这就是为什么预期返回1但实际输出0的核心原因。
问题2:numDigit函数中递归与while循环混用且递归无意义
你注释说明要用递归计算位数,但实际代码里用了while循环,还在循环内冗余调用numDigit(n)——这个递归既没有接收返回值,也没有参与位数计算,完全是多余的,不仅浪费资源,还可能引发栈溢出风险。
修正后的代码方案
下面是两种可行的修正版本,你可以根据习惯选择:
方案1:纯while循环计算位数(更高效)
// 计算数字的位数 int numDigit(int n) { // 处理n为0的特殊情况(0是1位) if (n == 0) return 1; int digitCount = 0; while (n > 0) { n /= 10; digitCount++; } return digitCount; } int findNumbers(int* nums, int numsSize){ int count = 0; for(int i = 0; i < numsSize; i++){ // 仅当位数为偶数时计数 if(numDigit(nums[i]) % 2 == 0){ count++; } // 移除了手动i++,依赖for循环自身的递增逻辑 } return count; }
方案2:纯递归计算位数(更简洁)
如果想保留递归实现,需要调整递归的终止条件和逻辑:
// 递归计算数字的位数(注意:n=0时返回0,调用时需单独处理) int numDigit(int n){ if(n == 0) return 0; return 1 + numDigit(n / 10); } int findNumbers(int* nums, int numsSize){ int count = 0; for(int i = 0; i < numsSize; i++){ int digitCount; // 单独处理n=0的情况(0是1位) if(nums[i] == 0){ digitCount = 1; } else { digitCount = numDigit(nums[i]); } if(digitCount % 2 == 0){ count++; } } return count; }
测试用例验证
对于输入[555,901,482,1771],修正后的代码会逐个处理所有元素:
- 555 → 3位(奇数)→ 不计数
- 901 → 3位(奇数)→ 不计数
- 482 → 3位(奇数)→ 不计数
- 1771 →4位(偶数)→ 计数
最终返回1,与预期结果一致。
内容的提问来源于stack exchange,提问作者Firdaus H. Salim
相关产品推荐
相关产品推荐

