JavaScript如何修改if条件以正确获取所有非唯一值?
重复字符查找函数的问题与优化
现有实现的问题根源
当前代码在排序字符数组后,仅通过相邻元素相等的判断直接push重复值,会导致同一连续重复段被多次触发push操作:
- 字符
c在排序后连续出现2次,循环会检测到1次相邻相等,push1次c - 字符
d在排序后连续出现4次,循环会检测到3次相邻相等,连续push3次d
最终返回的['c', 'd', 'd', 'd']带有大量冗余条目,无法输出真正需要的存在重复的非唯一字符集合。
代码修改方案
方案1:在原if判断中增加去重校验
扩展原有if条件,要求同时满足两个要求才push字符:
- 当前字符与下一个字符相等,确认存在重复
- 结果数组中未记录过当前字符,避免重复推送
修改后的核心判断逻辑:if (sorted_arr[i + 1] == sorted_arr[i] && !results.includes(sorted_arr[i]))
修改后完整可运行代码:
const findDuplicates = (word) => { let arr = word.toLowerCase(); let sorted_arr = [...arr].slice().sort(); let results = []; for (let i = 0; i < sorted_arr.length - 1; i++) { if (sorted_arr[i + 1] == sorted_arr[i] && !results.includes(sorted_arr[i])) { results.push(sorted_arr[i]); } } return results; } console.log(findDuplicates('piccdda123dd')); // 输出结果:['c', 'd']
方案2:跳过连续重复段减少无效循环
在检测到相邻相等、完成push后,直接将循环索引跳转到当前连续重复段的末尾位置,避免后续循环对同一段重复值重复触发判断,性能更优。
修改后的核心循环逻辑:
for (let i = 0; i < sorted_arr.length - 1; i++) { if (sorted_arr[i + 1] == sorted_arr[i]) { results.push(sorted_arr[i]); // 跳过整个连续重复段 while (sorted_arr[i + 1] === sorted_arr[i]) { i++; } } }
该逻辑运行后同样会输出正确的['c', 'd'],且不需要每次调用includes做全量数组校验。
内容的提问来源于stack exchange,提问作者MikiBelavista
相关产品推荐
相关产品推荐

