从整数字符串返回缺少的元素

时间:2014-03-06 22:02:26

标签: javascript

我正在尝试编写一个接受0到9(含)之间的唯一整数数组的函数,并返回缺少的元素。这就是我所拥有的。如此接近但到目前为止。

var currentPlace = 0;

function getMissingElement(superImportantArray){
    while (currentPlace < 9){
        for (var i = 0; i < 10; i++) {
            var arrayNum = superImportantArray[currentPlace]
            if (i == arrayNum) {
                currentPlace ++;
                console.log("so it's not " + i);
            }
            else if (i !=arrayNum) {
                console.log("try..." + i);
            }
        }
    }
}
// run
var myArray = [0,5,1,3,2,9,7,6,4]; // this test should return 8
getMissingElement(myArray);

我不确定我是否正确接近这一点。谢谢你的时间。

5 个答案:

答案 0 :(得分:1)

function getMissingElement(superImportantArray){
    var result = [], length = Math.max(10, superImportantArray.length);
    for (var i = 0; i < length; i++) {
        if(superImportantArray.indexOf(i) == -1){
            result.push(i);
        }
    }
    return result;
}

试试这个。这将返回一个缺少元素的数组,否则返回一个空数组。 DEMO FIDDLE

答案 1 :(得分:1)

所以这是一种方法:由于您知道数组只包含09的值,因此您可以构建一组“数字”并删除每个“看到”的值在数组中:

function getMissingElement(superImportantArray){
    var numbers = {};
    for (var i = 0; i < 10; i++) {
        numbers[i] = true
    }

    for (var i = 0, l = superImportantArray.length; i < l; i++) {
        delete numbers[superImportantArray[i]];
    }

    return Object.keys(numbers);
}

这将返回缺少所有数字的数组。如果总是只有一个缺失的数字,您可以轻松修改它以直接返回该数字。

答案 2 :(得分:1)

这应该这样做。

function getMissingElement(arrayTest) {
    // create an array with all digits
    var digitsArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    var index;
    for (var i=0; i<arrayTest.length; i++) {
         // get the index of current digit on our array
         index = digitsArray.indexOf(arrayTest[i]);
         // if found, remove it from our array.
         if (index >= 0) {
             digitsArray.splice(index,1);
         }
    }
    // the last remaining digit in the original array should be the one missing.
    return (digitsArray[0]);
}

答案 3 :(得分:1)

只想在评论中发表我的回答。在我看来,一种更简单的方法是循环遍历原始数组,并在它们所代表的索引处标记一个新数组。例如,如果数字为4,则标记新数组中的第4个索引。所有这一切的原因是因为一旦完成,一个索引应该保持未标记。剩下要做的就是找到未标记的索引。

这是一个例子(我在这里评论了代码,而不是小提琴):

function findMissing(array, min, max) {
    var missing, unfilledArray, i, j;

    // Array to hold the flags
    unfilledArray = [];

    for (i = min, j = max; i <= j; i++) {
        // Flag the index in the new array with the current value
        unfilledArray[array[i]] = true;
    }

    for (i = min, j = max; i <= j; i++) {
        // Loop over new array and find the unflagged index
        currentUnfilled = unfilledArray[i];
        if (!currentUnfilled) {
            // Current index not flagged
            missing = i;
            break;
        }
    }

    return missing;
}

DEMO: http://jsfiddle.net/6GAyw/

我添加的另一个小功能是你明确指定了最小值和最大值,在你的情况下,它是0和9.这个功能允许这个解决方案用于任何数字范围(不像我原来的评论/建议)。

并不是说我完全理解大O符号,但我相信这是O(2n),而不是O(n ^ 2),因为没有嵌套循环/ indexOf


如果您希望获取某个范围内的所有缺失数字,则可以轻松修改该函数以返回未标记索引的数组。这是一个例子:

function findMissing(array, min, max) {
    var missing, unfilledArray, i, j;

    // Array to hold the missing numbers
    missing = [];
    // Array to hold the flags
    unfilledArray = [];

    for (i = min, j = max; i <= j; i++) {
        // Flag the index in the new array with the current value
        unfilledArray[array[i]] = true;
    }

    for (i = min, j = max; i <= j; i++) {
        // Loop over new array and find the unflagged index
        currentUnfilled = unfilledArray[i];
        if (!currentUnfilled) {
            // Current index not flagged
            missing.push(i);
        }
    }

    return missing;
}

DEMO: http://jsfiddle.net/zFS89/

答案 4 :(得分:0)

这个对眼睛更好。

function getMissingElement(superImportantArray) {
 return superImportantArray.reduce(function (sum, value) {return sum - value;}, 45);
}