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

CodingBat sameEnds题解修复与Stream API实现咨询

sameEnds题目问题解答

题目说明

来自CodingBat的sameEnds题目要求:

若数组开头与末尾的N个数字组成的序列完全相同则返回true。例如对于数组{5, 6, 45, 99, 13, 5, 6},当n=0和n=2时首尾序列相同,当n=1和n=3时返回false。可假设参数n取值范围为闭区间0..nums.length。

测试用例:

sameEnds([5, 6, 45, 99, 13, 5, 6], 1) → false
sameEnds([5, 6, 45, 99, 13, 5, 6], 2) → true
sameEnds([5, 6, 45, 99, 13, 5, 6], 3) → false

原有代码问题与修复

原有代码的核心bug是外层多余的if (nums.length >= len * 2)判断:当len大于数组长度一半时,前后缀会出现重叠,这部分场景被直接跳过比较逻辑,会返回错误结果。比如数组[1,2,3,2,1]传入len=3时,前缀是[1,2,3]、后缀是[3,2,1]本应返回false,但原有代码会因为5 >= 3*2不成立直接返回true,逻辑错误。
修复方式为删掉这个多余的外层判断,直接遍历比较所有对应位置的元素即可,修复后代码:

public boolean sameEnds(int[] nums, int len) {
    for (int i = 0; i < len; i++) {
        if (nums[i] != nums[nums.length - len + i]) {
            return false;
        }
    }
    return true;
}

这个写法可以覆盖所有边界场景:

  • 当len=0时,循环不执行直接返回true,符合要求
  • 当len=nums.length时,比较的是每个元素和自身,必然返回true,符合要求
  • 前后缀重叠的场景也会正常逐位比较,不会漏判

Stream API实现方式

可以使用Stream API实现,逻辑和修复后的循环一致,通过IntStream生成索引范围,校验所有对应位置元素是否相等即可:

import java.util.stream.IntStream;

public boolean sameEnds(int[] nums, int len) {
    return IntStream.range(0, len)
            .allMatch(i -> nums[i] == nums[nums.length - len + i]);
}

这个实现同样覆盖所有边界场景:当len=0时,空流的allMatch操作默认返回true,逻辑正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:54:25