Codingbat 挑战赛:zeroMax Stream API 解决方案

Codingbat challenge: zeroMax Stream API Solution

提问人:Evgeniy 提问时间:6/12/2022 更新时间:6/12/2022 访问量:44

问:

给定来自 CodingBat 的任务 zeroMax zeroMax:

返回给定数组的一个版本,其中数组中的每个零值都替换为数组中零右侧的最大奇数值。如果零的右边没有奇数值,则将零保留为零。

zeroMax([0, 5, 0, 3]) → [5, 5, 3, 3]
zeroMax([0, 4, 0, 3]) → [3, 4, 3, 3]
zeroMax([0, 1, 0]) → [1, 1, 0]

我对这个任务的解决方案通过了 CodingBat 上的所有测试:

public int[] zeroMax(int[] nums) {
  boolean containsZero = java.util.stream.IntStream.of(nums).anyMatch(x -> x == 0);
  if (!containsZero) {
    return nums;
  }
  
  int[] zeroMax = new int[nums.length];
  int largestOddRight = 0;
  
  for (int i = 0; i < nums.length; i++) {
    if (nums[i] == 0) {
      for (int j = i+1; j < nums.length; j++) {
        if (nums[j] % 2 != 0) {
          if (nums[j] > largestOddRight) {
            largestOddRight = nums[j];
          }
        }
      }
      zeroMax[i] = largestOddRight;
      largestOddRight = 0;
    } else {
      zeroMax[i] = nums[i];
    }
    
  }
  
  return zeroMax;
}

但我有以下问题:

如何使用 Stream API 解决此任务?

Test results

Java 数组 java-stream

评论


答:

1赞 Eritrean 6/12/2022 #1

在数组的索引上流式传输,检查当前元素是否等于零,如果不是将其映射到自身,如果是,则使用过滤赔率从当前位置开始再次流式传输数组的其余部分,找到一个可选的最大值,如果可选,则返回当前元素,否则返回当前元素Arrays.stream(array, from, to)

public int[] zeroMax(int[] nums){
    boolean containsZero = java.util.stream.IntStream.of(nums).anyMatch(x -> x == 0);
    if (!containsZero) {
        return nums;
    }

    return java.util.stream.IntStream.range(0, nums.length).map(
            i -> nums[i] != 0 ? nums[i] : Arrays.stream(nums, i, nums.length)
                                                .filter(j -> j % 2 == 1)
                                                .max()
                                                .orElse(nums[i]))
            .toArray();
}