提问人:Evgeniy 提问时间:6/10/2022 最后编辑:Alexander IvanchenkoEvgeniy 更新时间:6/10/2022 访问量:78
Codingbat 挑战:sameEnds Stream API 解决方案
Codingbat challenge: sameEnds Stream API Solution
问:
给定任务 sameEnds from CodingBat:
如果数组开头和结尾的数字组相同,则返回 true。例如,对于 和 ,和 的结尾相同,而 和 的结尾为 false。您可以假设这在包含的范围内。
N
{5, 6, 45, 99, 13, 5, 6}
n=0
n=2
n=1
n=3
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
我对这个问题的解决方案通过了绝大多数测试,但不是全部:
public boolean sameEnds(int[] nums, int len) {
if (nums.length >= len * 2) {
for (int i = 0, j = nums.length - 1 ; i < len && len > 0; i++, j--) {
if (nums[i] != nums[j]) {
return false;
}
}
}
return true;
}
我的问题如下:
- 可以做些什么来修复我的解决方案?
- 是否可以使用 Stream API 解决此任务?
答:
1赞
Alexander Ivanchenko
6/10/2022
#1
您可以使用 allMatch()
操作来通过流实现它。
此解决方案通过了 CodingBat 上的所有测试用例:
public boolean sameEnds(int[] nums, int len) {
return java.util.stream.IntStream.range(0, len)
.allMatch(n -> nums[n] == nums[nums.length - (len - n)]);
}
对命令式解决方案的修复可能如下所示:
public boolean sameEnds(int[] nums, int len) {
for (int i = 0, j = nums.length - 1 - (len - 1); i < len; i++, j++) {
if (nums[i] != nums[j]) {
return false;
}
}
return true;
}
我删除了换行 if 条件,因为 when 被计算为它意味着需要比较的子数组重叠,但这并不意味着这些子数组是相等的。nums.length >= len * 2
false
条件是多余的,因为它保证在 范围内。len > 0
[0,nums.length]
表示尾部子数组中位置的变量已初始化为 - 最后一个有效索引减去子数组的长度。而循环的所谓增量语句从改为 。j
nums.length - 1 - (len - 1)
for
j--
j++
1赞
Eritrean
6/10/2022
#2
如果您使用的是 Java 9 或更高版本,则可以使用内置方法 Arrays.equals:
public boolean sameEnds(int[] nums, int len) {
return Arrays.equals(nums, 0, len, nums, nums.length - len, nums.length);
}
评论
len
nums.length / 2