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]区间内,既避免了不必要的内存占用,又提升了代码效率。
额外知识点梳理
- 循环变量的正确使用:循环中要明确谁是循环变量,不要随意修改方法的输入参数(比如你之前修改了
s,这会导致参数的原始值丢失,引发意外问题)。 - 列表操作的效率:
List.contains()需要遍历整个列表查找元素,当房子范围很大时,这种方法会非常慢;而直接的数值区间判断是O(1)的操作,性能差异巨大。 - 区间判断的边界:要注意是闭区间
[s,t],所以判断条件是>= s且<= t,不要漏掉等于t的情况。
内容的提问来源于stack exchange,提问作者user14361897
相关产品推荐
相关产品推荐

