JS比较数组元素返回布尔值:数组升序校验函数异常问题
代码问题分析
你编写的代码存在以下核心问题:
- 校验逻辑错误:只要数组中存在任意一对元素满足
arr[i] < arr[k+1]就会把结果永久设为true,后续即便出现降序的元素对也不会修改结果,因此只要乱序/降序数组中存在任意一组前小后大的元素,就会错误返回true - 冗余的双层循环:校验数组升序仅需对比相邻元素,单层循环即可完成,双层循环会将时间复杂度从O(n)拉高到O(n²),完全没有必要
- 数组越界风险:循环条件写为
i <= arr.length、k <= arr.length,而数组下标范围是0 ~ arr.length - 1,访问arr[arr.length]会得到undefined,会导致大小比较逻辑出现不可预期的错误 - 初始值设置错误:初始结果设为
false,不符合“默认认为数组升序,出现降序才标记为不通过”的校验逻辑
修复方案
仅需单层循环逐个对比相邻元素即可满足需求,修复后的代码如下:
function inAscOrder(arr) { // 长度小于2的数组天然符合升序要求 if (arr.length <= 1) return true for (let i = 1; i < arr.length; i++) { // 只要存在任意一个元素小于等于前一个元素,就不符合严格升序要求 if (arr[i] <= arr[i-1]) { return false } } // 所有相邻元素都满足严格升序要求 return true }
修改后即可全部通过你给出的四条测试用例。
内容的提问来源于stack exchange,提问作者Jonathan Joseph
相关产品推荐
相关产品推荐

