繁体   English   中英

如何找到更有效地将整数插入Javascript的数组位置?

[英]How do I find the array position in which an integer should be inserted in Javascript more efficiently?

我最近完成了此编程挑战(在FreeCodeCamp上):

返回将排序后的值(第二个参数)应插入数组(第一个参数)的最低索引。 返回的值应该是一个数字。

例如,getIndexToIns([1,2,3,4],1.5)应该返回1,因为它大于1(索引0)但小于2(索引1)。

同样,getIndexToIns([20,3,5],19)应该返回2,因为一旦对数组进行排序,它将看起来像[3,5,20],而19小于20(索引2)且大于5(索引1)。

我的代码可以运行,但效率似乎很低,而且可能不必要地冗长。 我不仅要解决挑战,而且要成为一名编写高质量代码的优秀程序员。 本着这种精神,我希望这里的Javascript专家可以为我提供一些示例,说明如何更有效地解决此问题。

 function getIndexToIns(arr, num) { var diff = 0; var minDiff = 0; var insPos = 0; function sortNumber(a,b) { return a - b; } arr.sort(sortNumber); for(var i = 0; i < arr.length; i++){ diff = num - arr[i]; if(i === 0 || (diff < minDiff && diff >= 0)){ minDiff = diff; if(arr[i] == num){ insPos = i; } else{ insPos = i + 1; } } } return insPos; } 

谢谢你的帮助!

 var arr=[1,2,3,4,5]; function getIndexToIns(num) { var diff = 0; var minDiff = 0; var insPos = 0; arr.sort(sortNumber); var pos=-1; for(var i = 0; i < arr.length; i++){ if(arr[i]>=num){ pos=i; break; } } if(pos>=0){ alert('Index: ' + pos); }else{ alert('Not Found. Perhaps: at ' + arr.length); } } function sortNumber(a,b) { return a - b; } 
 <input type="text" id="num"> <button type="button" onclick=getIndexToIns(document.getElementById('num').value);>Find Pos</button> 

如果我们的输入数组已排序,则让要搜索(和插入)的项目为整数甚至对象,此工作最好由二进制搜索算法完成。 给定输入数组的排序速度,它们比indexOffindIndex 因此,假设输入数组已经排序,下面的二进制搜索函数将返回搜索到的项目索引,或者如果不存在,则返回负整数,指定否定插入索引。 因此,如果返回-3,则搜索项丢失,应将其插入索引3,以免破坏排序。

PS如果将不存在的项目放置在索引0处,则将返回-0(负零)。

 Array.prototype.sortedFindIndex = function(val, cb = x => x) { // default callback for primitive arrays var deli = this.length-1, // delta index base = 0, // base to add the delta index expectedAt = i => { while (this[i] !== void 0 && cb(this[i]) < val) ++i; return -i}; while (deli > 0 && cb(this[base + deli]) != val) { deli = ~~(deli/2); cb(this[base + deli]) < val && (base += deli); } return cb(this[base + deli]) === val ? base + deli : expectedAt(base + deli); }; var arr = [{a:0,b:"foo"},{a:1,b:"bar"},{a:2,b:"baz"},{a:3,b:"qux"},{a:4,b:"fox"},{a:5,b:"pun"},{a:6,b:"alf"},{a:7,b:"alf"},{a:8,b:"alf"},{a:9,b:"alf"},{a:10,b:"alf"},{a:11,b:"alf"},{a:13,b:"alf"}], brr = [3,6,7,9,13,15,18,21,22,25,29,33,37,42,65], idx = arr.sortedFindIndex(12, o => oa); console.log(idx); idx = brr.sortedFindIndex(27); console.log(idx); 

为了找到最低的索引,应该执行三个步骤:1)在现有数组中添加一个新元素; 2)对新数组中的所有数字进行升序排序; 3)找到要搜索的索引。 如果新数组的所有元素都是数字,则此代码有效(这足以应付https://www.freecodecamp.com上的挑战)

function getIndexToIns(arr, num) {
  var newArr = arr;
  newArr.push(num);  //add a new element num to the end of the array

  function compareNumbers(a,b){
    return a - b;
  }

  var sorted = newArr.sort(compareNumbers); //sort the numbers in the array

  for (var i = 0; i < sorted.length; i++)
    {
      if (sorted[i] === num) //index of the element equal to num is the index you are looking for
        {
          return i; 
        }
    }
}
getIndexToIns([2, 20, 10], 19);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM