求解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)有两个致命问题:- 逻辑运算符用反了:应该用
&&而非||。我们需要同时满足i+2在数组合法范围内和目标云是安全的(值为0),才能选择跳两步。用||会导致只要其中一个条件成立就跳两步,比如i+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)- 逻辑运算符用反了:应该用
循环终止与计数错误:
- 原循环的终止条件是
i<n,但当i到达n-1(最后一个云)时,我们已经抵达终点,不需要再进行跳跃。所以循环应该在i < n-1时继续执行——只要还没到最后一个云,才需要判断下一步跳法。 - 最后输出
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
相关产品推荐
相关产品推荐

