Codingbat 挑战:sameEnds Stream API 解决方案

Codingbat challenge: sameEnds Stream API Solution

提问人:Evgeniy 提问时间:6/10/2022 最后编辑:Alexander IvanchenkoEvgeniy 更新时间:6/10/2022 访问量:78

问:

给定任务 sameEnds from CodingBat

如果数组开头和结尾的数字组相同,则返回 true。例如,对于 和 ,和 的结尾相同,而 和 的结尾为 false。您可以假设这在包含的范围内。N{5, 6, 45, 99, 13, 5, 6}n=0n=2n=1n=3n0..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;
}

我的问题如下:

  1. 可以做些什么来修复我的解决方案?
  2. 是否可以使用 Stream API 解决此任务?
Java 数组 for 循环 if-statement java-stream

评论

0赞 John Kugelman 6/10/2022
哪些测试用例失败了?
0赞 John Kugelman 6/10/2022
规范不禁止大于 .开始和结束可以重叠。lennums.length / 2

答:

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 * 2false

条件是多余的,因为它保证在 范围内。len > 0[0,nums.length]

表示尾部子数组中位置的变量已初始化为 - 最后一个有效索引减去子数组的长度。而循环的所谓增量语句从改为 。jnums.length - 1 - (len - 1)forj--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);
}