篝火算法挑战:我在哪里属于javascript

时间:2017-03-02 16:06:04

标签: javascript arrays sorting

大家好,我目前在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);

当我运行它运行的代码但它没有通过测试。伙计们,我需要你的帮助。感谢

5 个答案:

答案 0 :(得分:3)

到目前为止提出的解决方案倾向于遵循问题的请求:首先对数组进行排序,然后找到插入数字的索引。这会让你循环遍历数组两次。如果必须克隆阵列,请执行更多操作。这很慢,即使没有考虑我们最终创造的所有垃圾......

我们可以做得更好吗?我想是的。

如何计算数组中的数字数量是否小于或等于要插入的数字&#34;。这实现了相同的目标,但让我们只在阵列上循环一次。

&#13;
&#13;
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;
&#13;
&#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;

}