You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

freeCodeCamp算法题:为何我的getIndexToIns函数部分用例不通过?

问题:数组插入索引计算代码失效原因分析

任务要求:返回将第二个参数(数值)插入已排序后的第一个参数(数组)中的最小索引,返回值为数字。示例:

  • getIndexToIns([1,2,3,4], 1.5) 应返回1
  • getIndexToIns([20,3,5], 19) 应返回2

实现代码如下:

function getIndexToIns(arr, num) {
  let newArray = [...arr, num].sort()
  let result = newArray.indexOf(num);
  return result;
}

该代码在getIndexToIns([10, 20, 30, 40, 50], 30)等用例中输出正确,但在getIndexToIns([5, 3, 20, 3], 5)等用例中输出错误,请问为何代码失效?


问题原因与修复方案

核心问题:默认sort()的排序逻辑错误

JavaScript的Array.sort()方法默认按字符串Unicode码点排序,而非数值大小排序。这会导致数值排序结果不符合预期:

  • 比如测试用例[5, 3, 20, 3]拼接5后得到[5,3,20,3,5],用默认sort()会得到[20,3,3,5,5](因为字符串"20"的首字符"2"的Unicode码小于"3"),此时indexOf(5)返回3,但正确的数值排序结果应为[3,3,5,5,20],插入5的最小索引是2。
  • 像[10,20,30]这类数组,字符串排序和数值排序结果一致,所以代码能正常工作,但只要遇到数值大小与字符串顺序不符的情况(比如包含一位数和两位数),就会出错。

修复方案:使用数值比较函数

给sort()传入一个比较函数(a, b) => a - b,强制按数值从小到大排序:

function getIndexToIns(arr, num) {
  let newArray = [...arr, num].sort((a, b) => a - b);
  let result = newArray.indexOf(num);
  return result;
}

更高效的实现思路

不需要拼接整个数组再排序,可以先对原数组排序,再遍历找到第一个大于等于num的元素索引,性能更优:

function getIndexToIns(arr, num) {
  arr.sort((a, b) => a - b);
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] >= num) return i;
  }
  // 如果num大于所有元素,返回数组长度
  return arr.length;
}

内容的提问来源于stack exchange,提问作者asia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:40:28