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

求解HackerRank《Jumping on the Clouds》C语言代码的错误问题

求解HackerRank《Jumping on the Clouds》C语言代码的错误问题

Hey Jenny, let's break down the issues in your code one by one—there are a few key bugs that are causing those inconsistent test case failures:

  • 数组读取逻辑错误:你现在只用scanf("%d",&c[n]);读取数组,这只会把一个值存入数组越界位置(数组下标范围是0到n-1,c[n]不在合法范围内),而且完全没读取剩下的n-1个元素。这会导致数组里大部分是随机垃圾值,直接打乱后续的跳跃判断逻辑。你需要用循环读取所有n个元素:

    for(int i=0; i<n; i++){
        scanf("%d", &c[i]);
    }
    
  • 跳跃条件判断错误:你的if(c[i+2]== 0 || i+2 <= n)有两个致命问题:

    1. 逻辑运算符用反了:应该用&&而非||。我们需要同时满足i+2在数组合法范围内和目标云是安全的(值为0),才能选择跳两步。用||会导致只要其中一个条件成立就跳两步,比如i+2超出数组范围时也会强行跳,触发数组越界访问的未定义行为。
    2. 范围判断不准确:数组最后一个合法下标是n-1,所以i+2应该满足i+2 < n(等价于i+2 <= n-1),而不是i+2 <=n,否则会访问到c[n]这个越界位置。
      修正后的条件应该是:
    if(i+2 < n && c[i+2] == 0)
    
  • 循环终止与计数错误:

    1. 原循环的终止条件是i<n,但当i到达n-1(最后一个云)时,我们已经抵达终点,不需要再进行跳跃。所以循环应该在i < n-1时继续执行——只要还没到最后一个云,才需要判断下一步跳法。
    2. 最后输出count-1是多余的,因为每次跳跃我们都正确给count加1,到达终点时count就是准确的跳跃次数,不需要额外减1。另外,你在循环里加的printf("%d",count);是调试用的,建议去掉避免干扰最终输出。

修正后的完整代码

#include<stdio.h>

int main()
{
    int n;
    scanf("%d",&n);
    int c[n];
    // 读取所有n个云的状态
    for(int i=0; i<n; i++){
        scanf("%d", &c[i]);
    }
    int count = 0;
    // 循环到倒数第二个云为止,到达最后一个云即停止
    for(int i=0; i < n-1;){
        // 优先选择跳两步(如果安全且不越界)
        if(i+2 < n && c[i+2] == 0){
            i += 2;
            count++;
        } else {
            // 只能跳一步的情况
            i += 1;
            count++;
        }
    }
    printf("%d\n",count);
    return 0;
}

举个测试案例验证:输入7,数组0 0 1 0 0 1 0,正确的跳跃次数是4次(0→1,1→3,3→4,4→6),修正后的代码会准确输出4。

备注:内容来源于stack exchange,提问作者Jenny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:04:07