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
相关产品推荐
相关产品推荐

