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

HackerRank苹果橙子计数功能异常:橙子统计失效原因排查求助

问题排查与解决方案

首先,咱们来揪出导致橙子统计始终为0的核心bug——构建house列表的for循环完全写错了!

看这段代码:

for(int i = s; s < t; s++){ 
    house.add(i); 
}

你初始化了i = s,但整个循环里从来没更新过i的值,反而一直在修改方法参数s。这会导致什么结果呢?比如初始s=7,t=10,循环会执行3次,但每次添加到house里的都是7(因为i从来没变过),最终house列表是[7,7,7],而不是你期望的[7,8,9,10]。

为什么苹果统计看似有效?大概率是你的测试用例里,苹果掉落的位置刚好等于初始的s值,所以house.contains(...)能命中;而橙子的掉落位置都不等于这个重复的s,自然永远返回false,计数器一直是0。

修复方案:两种思路

思路1:正确构建house列表

把循环改成正常遍历s到t的所有整数,不要修改原参数s:

for(int i = s; i <= t; i++){ 
    house.add(i); 
}

这里用i作为循环变量,从s递增到t(包含t,因为房子范围是闭区间[s,t]),这样house里才会包含所有房子覆盖的位置。

思路2:更高效的直接判断(推荐)

其实完全没必要构建house列表——判断一个掉落位置是否在房子范围内,直接用条件判断就够了,比List.contains()的O(n)效率高太多:

public static void countApplesAndOranges(int s, int t, int a, int b, List<Integer> apples, List<Integer> oranges) { 
    int applesOnHouse = 0; 
    int orangesOnHouse = 0; 

    // 统计苹果
    for(int offset : apples) {
        int position = a + offset;
        if(position >= s && position <= t) {
            applesOnHouse++;
        }
    }

    // 统计橙子
    for(int offset : oranges) {
        int position = b + offset;
        if(position >= s && position <= t) {
            orangesOnHouse++;
        }
    }

    System.out.println(applesOnHouse); 
    System.out.println(orangesOnHouse); 
}

这里用了增强for循环(更简洁),直接计算每个水果的掉落位置,然后判断是否在[s,t]区间内,既避免了不必要的内存占用,又提升了代码效率。

额外知识点梳理

  1. 循环变量的正确使用:循环中要明确谁是循环变量,不要随意修改方法的输入参数(比如你之前修改了s,这会导致参数的原始值丢失,引发意外问题)。
  2. 列表操作的效率:List.contains()需要遍历整个列表查找元素,当房子范围很大时,这种方法会非常慢;而直接的数值区间判断是O(1)的操作,性能差异巨大。
  3. 区间判断的边界:要注意是闭区间[s,t],所以判断条件是>= s且<= t,不要漏掉等于t的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 02:59:07