当前位置: 首页 > 知识库问答 >
问题:

Codingbat挑战:not Alone Stream API解决方案

拓拔烨赫
2023-03-14

给定CodingBat中的任务notAlone:

如果数组中的元素前后都有值,并且这些值与它不同,那么我们会说它是“单独的”。返回给定数组的一个版本,其中给定值的每个单独实例都被其左侧或右侧较大的值替换。

notAlone([1, 2, 3], 2) → [1, 3, 3]
notAlone([1, 2, 3, 2, 5, 2], 2) → [1, 3, 3, 5, 5, 2]
notAlone([3, 4], 3) → [3, 4]

我对这个问题的解决方案通过了绝大多数测试,但不是所有测试:

public int[] notAlone(int[] nums, int val) {
  int[] notAlone = new int[nums.length];
  int largestNeighbour = 0;
  
  if (notAlone.length >= 1) {
    notAlone[0] = nums[0];
    notAlone[notAlone.length - 1] = nums[nums.length - 1];
  }
  
  for (int i = 1; i < notAlone.length - 1; i++) {
    if (nums[i] != val) {
      notAlone[i] = nums[i];
    }
    
    if (nums[i] == val) {
      notAlone[i] = Math.max(nums[i - 1], nums[i + 1]);
    }
  }
  
  return notAlone;
}

我的问题如下:

如何解决我的问题?

是否可以使用Stream API解决此任务?

测试结果

共有1个答案

孙玮
2023-03-14

如果数组中的元素前后都有值,并且这些值与它不同,则该元素是“单独的”

您的解决方案没有通过所有测试,因为您没有检查当前数组元素是否单独存在,也就是说,您只检查当前元素是否等于目标值,而不是检查左侧或右侧是否存在相等的元素。

这就是如何使用streams完成的,下面的代码通过了对CodingBat的所有测试:

public int[] notAlone(int[] nums, int val) {
    return IntStream.range(0, nums.length)
        .map(i -> isAlone(nums, val, i) ?
            Math.max(nums[i - 1], nums[i + 1]) : nums[i])
        .toArray();
}

public boolean isAlone(int[] nums, int val, int i) {
    return nums[i] == val && i > 0 && i < nums.length - 1
        && nums[i - 1] != val && nums[i + 1] != val;
}

您提供的命令式代码可以这样修复(通过所有测试):

public int[] notAlone(int[] nums, int val) {
    if (nums.length == 0) return nums; // guarding against an empty array
    
    int[] notAlone = new int[nums.length];
    notAlone[0] = nums[0];
    notAlone[nums.length - 1] = nums[nums.length - 1];
    
    for (int i = 1; i < notAlone.length - 1; i++) {
        if (nums[i] == val && nums[i - 1] != val && nums[i + 1] != val) { // is "alone"
            notAlone[i] = Math.max(nums[i - 1], nums[i + 1]);
        } else { // is not "alone"
            notAlone[i] = nums[i];
        }
    }
    
    return notAlone;
}
 类似资料:
  • 给定CodingBat中的任务sameEnds: 如果数组开头和结尾的数字组相同,则返回true。例如,对于,n=0和n=2的endpoint相同,n=1和n=3的endpoint相同。您可以假设n在0范围内。。nums。长度(含)。 我对这个问题的解决方案通过了绝大多数测试,但不是所有测试: 我的问题如下: 如何修复我的解决方案 是否可以使用流API解决此任务

  • 给定来自CodingBat的zeroFront notAlone任务: 返回一个数组,该数组包含与给定数组完全相同的数字,但重新排列以使所有零都在数组的开头分组。非零数字的顺序并不重要。因此变为。您可以修改并返回给定数组或制作一个新数组。 我对这个问题的解决方案在某些情况下会抛出ArrayIndexOutOfBoundsException: 我的问题如下: 如何解决我的问题? 如何使用Stream

  • 给定来自CodingBat的任务sumNumbers sumNumbers: 给定一个字符串,返回字符串中出现的数字之和,忽略所有其他字符。数字是一行中一个或多个数字字符的序列。(注意:Character.isDigit(char)测试字符是否为字符“0”、“1”、…、'9'. 整数parseInt(string)将字符串转换为int.) 我对这个问题的解决方案如下: 是否可以使用流API解决此问

  • 给定CodingBat的任务镜像: 给定一个字符串,请在给定字符串的开头和结尾处查找镜像(向后)字符串。 换句话说,在给定字符串的最开始,以及在字符串的最末尾以相反的顺序(可能重叠)出现零个或多个字符。例如,字符串具有镜像结尾。 示例: 我对此任务的解决方案如下: 是否可以使用Stream API解决此问题?

  • 我正在尝试解决hackerrank中的一个“几乎已排序”的挑战。问题是: 给定一个包含元素的数组,可以只使用以下操作之一按升序对该数组进行排序吗? 交换两个元素。反转一个子段。 输入格式 第一行包含一个整数,指示数组的大小。 下一行包含以空格分隔的整数。 样本输入#1 2 4 2 示例输出 #1 是< br >交换1 2 示例输入 #2 3 3 1 2 样品输出#2 不 示例输入 #3 6 1 5