簡體   English   中英

篝火算法挑戰:我在 javascript 上屬於什么位置

[英]Bonfire Algorithm Challenge: Where Do I Belong on javascript

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

當我運行代碼時,它工作但沒有通過測試。 伙計們,我需要你們的幫助。 謝謝

迄今為止提出的解決方案傾向於從字面上遵循問題的要求:首先對數組進行排序,然后找到插入數字的索引。 這會讓您在數組上循環兩次。 如果您必須克隆陣列,則更多。 這很慢,即使不考慮我們最終創造的所有垃圾......

我們能做得更好嗎? 我想是這樣。

如何“計算數組中有多少數字小於或等於要插入的數字”。 這實現了相同的目標,但讓我們只在數組上循環一次。

 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

那個怎么樣?! 快兩倍*,耶!

*它可能不會真正快兩倍,如果你必須對我的主張挑剔......

編輯

其實我可以做得更好。 三元 if 在代碼中引入了一些讓我煩惱的分支。 我們可以利用 javascript 的怪異性來避免它

arr.reduce(function (c, x) { return c + (x <= num) }, 0)

為什么? 因為當與數字運算結合時, true被轉換為 1, false被轉換為 0
這從代碼中刪除了額外的分支,因此它會比以前的版本稍微快一點......如果你關心它,它也會更容易進行單元測試。

您可以迭代並檢查實際值是否大於數字。 然后返回實際索引。 如果沒有值匹配,則返回數組的長度作為新的輸入索引。

 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

如果我理解正確,我認為您應該查看列表中的上一項:

 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

感謝大家的幫助。 我想通了,這是這里的最終代碼

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;
}

我對這個問題的解決方案。

const getIndexToIns = (arr, num) => {
    let newArr = arr.concat(num);

    newArr.sort(function(a, b) {
        return a - b;
    });

    let index = newArr.indexOf(num);

    return index;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM