我如何找到数组的位置,其中一个整数应该在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;
}
谢谢你的帮助!
如果我们的输入数组是排序的,让要搜索(和插入)的项是整数或偶数对象,这项工作最好由二进制搜索算法完成。给定输入数组排序,这些比indexOf
或findIndex
快得多。因此,假设输入数组已经排序,下面的二进制搜索函数将返回搜索项的索引,或者如果不存在,它将返回一个负整数,指定插入索引。因此,如果它返回-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 => o.a);
console.log(idx);
idx = brr.sortedFindIndex(27);
console.log(idx);
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>
要找到最低索引需要执行三个步骤: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);
相关文章:
- 我想在AngularJS应用程序中创建一个输入数字框,用户不应该在该框上键入十进制数字.(一个整数输入框)
- Javascript-当存在's是一个整数标记
- 有可能得到一个大整数实例的自然日志吗
- 如何拆分一个整数和产生的所有数字来创建一个新数字
- 创建一个javascript数组(N),该数组由连续的较小整数组成,其和为1000
- 如何要求用户输入一个介于 1 和 50 之间的整数,然后小程序打印出一行这个星数
- 找到字符串值,但需要一个整数
- 使用javascript向上取整到下一个整数,即使值为1.0000000001
- 只使用一个整数表示颜色-Javascript
- 将随机整数分配给数组中的项,summa应该是一个固定的数字
- 在字符串名称后附加一个整数
- JavaScript:将一个整数与一长串字符串关联起来
- 如何传递一个整数来创建新的变量名
- 将浮点数向上舍入到 javascript 中的下一个整数
- node.js - 发送一个整数作为 POST 请求中的输入参数
- 在类名的末尾添加一个整数
- 我想用javascript创建一个随机整数
- 正则表达式仅检查一个整数
- JavaScript 函数通过发送下一个元素的整数来更改元素的可见性
- 正则表达式,用于将字符串中的最后一个整数与 php 和 javascript 匹配