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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:52:39