大家好,我目前在FCC上遇到这个算法挑战。这就是挑战的全部内容:
在排序后,返回应将值(第二个参数)插入数组(第一个参数)的最低索引。返回的值应该是一个数字。
例如,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)。
这是我的代码:
function getIndexToIns(arr, num) {
var getIndx;
var newArr = arr.sort(function (a, b) {
return (a - b);
});
for (i = 0; i < newArr.length; i++) {
if (num > newArr[i]) {
getIndx = newArr.indexOf(newArr[i]);
}
}
return getIndx;
}
getIndexToIns([10, 20, 30, 40, 50], 35);
当我运行它运行的代码但它没有通过测试。伙计们,我需要你的帮助。感谢
答案 0 :(得分:3)
到目前为止提出的解决方案倾向于遵循问题的请求:首先对数组进行排序,然后找到插入数字的索引。这会让你循环遍历数组两次。如果必须克隆阵列,请执行更多操作。这很慢,即使没有考虑我们最终创造的所有垃圾......
我们可以做得更好吗?我想是的。
如何计算数组中的数字数量是否小于或等于要插入的数字&#34;。这实现了相同的目标,但让我们只在阵列上循环一次。
function getIndexToIns(arr, num) {
return arr.reduce(function (c, x) { return x <= num ? c+1 : c }, 0);
}
console.log(getIndexToIns([10, 20, 30, 40, 50], 35)); // 3
console.log(getIndexToIns([20,3,5], 19)); //2
console.log(getIndexToIns([1,2,3,4], 1.5)); //1
console.log(getIndexToIns([1,2,3,4], 1)); //1
console.log(getIndexToIns([1,2,3,4], 0)); //0
&#13;
那怎么样?!快两倍*,耶!
*如果你对我的说法不满意的话,它可能不会真的快两倍......
其实我可以做得更好。这三元如果在代码中引入一些困扰我的分支。我们可以利用javascript怪异来避免它
arr.reduce(function (c, x) { return c + (x <= num) }, 0)
为什么呢?因为当与数字操作结合时true
转换为1而false
转换为0
这样就消除了代码中的额外分支,因此它会比以前的版本稍微快一些......如果您关心它,单元测试也会更容易。
答案 1 :(得分:2)
您可以迭代并检查实际值是否大于数字。然后重新调整实际索引。如果没有值匹配,则返回数组的长度作为新的输入索引。
function getIndexToIns(arr, num) {
var i;
arr.sort(function(a, b){
return a - b;
});
for (i = 0; i < arr.length; i++) {
if (arr[i] > num) {
return i;
}
}
return arr.length;
}
console.log(getIndexToIns([10, 20, 30, 40, 50], 35)); // 3
console.log(getIndexToIns([1, 2, 3, 4], 1.5)); // 1
console.log(getIndexToIns([20, 3, 5], 19)); // 2
console.log(getIndexToIns([4, 3, 2, 1], 5)); // 4
不使用Array
API
function getIndexToIns(array, value) {
var i = array.length,
p = 0;
while (i--) {
p += array[i] <= value;
}
return p;
}
console.log(getIndexToIns([10, 20, 30, 40, 50], 35)); // 3
console.log(getIndexToIns([1, 2, 3, 4], 1.5)); // 1
console.log(getIndexToIns([20, 3, 5], 19)); // 2
console.log(getIndexToIns([4, 3, 2, 1], 5)); // 4
答案 2 :(得分:1)
如果我理解正确,我认为您应该查看列表中的上一项:
function getIndexToIns(arr, num) {
var getIndx = 0;
var newArr = arr.sort(function (a, b) { return (a - b); });
for (i = 1; i < newArr.length; i++) {
if (num >= newArr[i-1]) {
getIndx = i;
}
}
return getIndx;
}
console.log(getIndexToIns([10, 20, 30, 40, 50], 35)); // 3
console.log(getIndexToIns([20,3,5], 19)); //2
console.log(getIndexToIns([1,2,3,4], 1.5)); //1
console.log(getIndexToIns([1,2,3,4], 1)); //1
console.log(getIndexToIns([1,2,3,4], 0)); //0
答案 3 :(得分:0)
感谢各位的帮助。我想通了,这是最后的代码
function getIndexToIns(arr, num) {
var getIndx;
var newArr = arr.sort(function(a, b){
return (a - b);
});
for (i = 0; i < newArr.length; i++) {
if (newArr[i] > num || newArr[i] === num) {
return i;
}
}
return newArr.length;
}
答案 4 :(得分:0)
我对这个问题的解决方案。
const getIndexToIns = (arr, num) => {
let newArr = arr.concat(num);
newArr.sort(function(a, b) {
return a - b;
});
let index = newArr.indexOf(num);
return index;
}