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

Java实现跳石头最少步数计算时count值中途异常下降问题求助

最少跳跃步数代码问题排查与修复

核心错误原因

  • 主方法重复调用countJumps方法,且该方法会直接修改传入的原始岩石数组:
    你在main方法中先调用countJumps(rocks)==-1做是否可达的判断,这次调用已经把原始数组的元素全部修改了,后续第二次调用countJumps(rocks)计算步数时,用的是被第一次调用改乱的数组,自然会出现计数异常、中途重新从1开始的问题。
  • 跳跃终止条件逻辑错误:
    countJumps方法的循环条件distjumped < rocks[rocks.length-1]中,rocks[rocks.length-1]的值会随着adjustArray的调用不断变小,你没有在一开始就存储原始终点的位置,导致终止判断完全错误。
  • 隐含逻辑依赖:代码默认输入的岩石位置是升序排列的,没有做输入校验,如果输入的岩石位置乱序,也会导致计算结果异常。

修复方案

  1. 主方法只调用一次countJumps,先拿到返回结果再做判断输出,避免重复修改数组。
  2. 在countJumps方法最开始就存储原始的终点位置,作为循环终止的判断依据。
  3. 可选:增加输入岩石数组的升序校验/自动排序逻辑,兼容乱序输入。

修复后的代码

import java.util.*;

class RabbitJumps {
  
  public static void main (String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.print("Enter the number of rocks: ");
    int size = sc.nextInt();
    System.out.print("Enter locations of " +size+ " rocks: ");
    int[] rocks = new int[size];
    for (int i = 0; i<size; i++) {
      rocks[i] = sc.nextInt();
    }
    // 只调用一次countJumps,避免重复修改数组
    int res = countJumps(rocks);
    if (res==-1) {
      System.out.println("Impossible");
    } else {
      System.out.println(res+" jumps");
    }
  }
  public static int countJumps(int[] rocks) {
    // 先检查相邻岩石间隔是否超过50
    for (int i = 0; i<rocks.length-1; i++) {
      if (rocks[i+1]-rocks[i]>50) {
        return -1;
      }
    }
    int count = 0;
    int distjumped = 0;
    // 提前存储原始终点位置,避免后续数组修改影响终止判断
    int finalPos = rocks[rocks.length-1];
    while (distjumped < finalPos) {
      int whichrock = nextStep(rocks); 
      distjumped += rocks[whichrock];
      adjustArray(rocks, whichrock);
      count++;
    }
    return count;
  }
  public static int nextStep(int[] rocks) {
    int dist = 0;
    int whichrock = 0;
    for (int i = 0; i<rocks.length; i++) {
      if (rocks[i]>dist && rocks[i]<=50) {
        dist=rocks[i];
        whichrock = i;
      } 
    }
    return whichrock;
  }
  public static void adjustArray(int[] rocks, int whichrock) {
    int dist = rocks[whichrock];
    for (int i = 0; i<rocks.length; i++) {
      rocks[i]-=dist;
    }
    for (int i = 0; i<=whichrock; i++) {
      rocks[i]=0;
    }
  }
}

内容的提问来源于stack exchange,提问作者chickennugget

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:06:03