为什么我的Typescript解法在Codesignal仅通过9/10个测试用例?
问题原因分析
核心错误:数组排序逻辑不符合预期
TypeScript 中 Array.sort() 方法默认采用Unicode 字典序对元素进行排序,而非你预期的数字大小排序。比如对于数字数组 [10, 2],默认排序结果为 [10, 2](因为字符串'10'的 Unicode 编码小于'2'),这会导致你后续取到的数组最小值、最大值完全错误,所有计算逻辑都失效。
两个版本代码通过率不同的原因
- 第一个版本用
filter + indexOf的逻辑,在排序正确的前提下可以得到正确结果,但因为排序错误,仅部分测试用例刚好符合字典序排序的结果,所以通过了9个用例。 - 第二个版本
full.length - sorted.length的逻辑本身是正确的(无重复元素的前提下,连续序列总长度减去已有元素长度就是需要补充的数量),但排序错误导致full数组的上下界偏差更大,所以通过率更低。
修复方案
1. 修复排序逻辑
给sort方法传入数字升序比较函数即可解决问题:
let sorted: number[] = statues.sort((a, b) => a - b);
修复排序逻辑后你的两个版本代码都可以正常通过所有测试用例。
2. 更高效的优化写法
不需要排序、也不需要生成额外数组,直接计算即可得到结果:
function makeArrayConsecutive2(statues: number[]): number { const min = Math.min(...statues); const max = Math.max(...statues); return max - min + 1 - statues.length; }
内容的提问来源于stack exchange,提问作者El Niño
相关产品推荐
相关产品推荐

