Codingbat notAlone题解bug修复及Stream API实现咨询
notAlone 题目说明
题目规则如下:
我们定义:若数组中的某元素同时存在前置、后置相邻元素,且两侧相邻元素的值均与该元素不同,则称该元素处于**"alone"状态。
请返回处理后的数组:所有值等于给定val、且处于alone状态的元素,都需要替换为其左右相邻元素中的较大值**。
官方示例输入输出:
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]
问题1:原有代码的缺陷与修复方案
核心问题
原有代码的逻辑遗漏了alone状态的必要判断条件:只有当值为val的元素,左右相邻元素都和自身值不相等时,才需要替换。原代码只要遍历到非首尾位置、值等于val的元素,就直接替换为左右邻居的最大值,没有校验邻居是否和当前元素值相等,会错误替换不满足alone条件的val元素。
举个典型错误场景:输入[1,2,2,3]、val=2,索引2位置的2左侧相邻值也是2,不满足alone状态,应该保留原值2,但原代码会将其替换为max(2,3)=3,输出错误结果[1,2,3,3]。
除此之外原代码存在冗余:声明了largestNeighbour变量但从未使用,不影响运行结果但属于无效代码。
修复后代码
public int[] notAlone(int[] nums, int val) { int[] res = new int[nums.length]; // 空数组直接返回 if (nums.length == 0) return res; // 首尾元素不可能满足alone条件,直接赋值 res[0] = nums[0]; res[res.length - 1] = nums[nums.length - 1]; for (int i = 1; i < res.length - 1; i++) { if (nums[i] != val) { // 非目标值直接保留 res[i] = nums[i]; } else { // 目标值需校验是否满足alone条件 if (nums[i-1] != val && nums[i+1] != val) { res[i] = Math.max(nums[i-1], nums[i+1]); } else { res[i] = nums[i]; } } } return res; }
问题2:Stream API 实现方案
可以通过Stream API基于索引遍历实现,逻辑和循环写法完全一致,不存在相邻元素访问的障碍,代码如下:
import java.util.stream.IntStream; public int[] notAlone(int[] nums, int val) { return IntStream.range(0, nums.length) .map(i -> { // 首尾元素直接返回原值 if (i == 0 || i == nums.length - 1) { return nums[i]; } // 非目标值直接返回 if (nums[i] != val) { return nums[i]; } // 满足alone条件才替换为邻居最大值 if (nums[i-1] != val && nums[i+1] != val) { return Math.max(nums[i-1], nums[i+1]); } // 其余情况保留原值 return nums[i]; }) .toArray(); }
内容的提问来源于stack exchange,提问作者Evgeniy
相关产品推荐
相关产品推荐

