11

このような一連の数字の最初の欠落数を見つける方法を見つけようとしています (1,2,3,5,6,9,10,15)

後で使用するために、最初の欠落番号 #4 を変数に入れたいのですが、その方法がわかりません。

私はこれを試しましたが、これは私に最後の番号しか与えません:

var mynumbers=new Array(1,2,3,6,9,10);
for(var i = 1; i < 32; i++) {
    if(mynumbers[i] - mynumbers[i-1] != 1) {
        alert("First missing number id: "+mynumbers[i]);
        break;
    }
}

まず最初に、数値シーケンスの「穴」の後に最初の数値が表示されます。次に、ブレークを挿入しない場合、「穴」の後に続くすべての数値に警告を発し続けます。1 から 32 までの数値列の最初の欠落した数値のみが必要です。どうすればよいですか?

事前に助けと感謝を願っています;-)

4

11 に答える 11

14

これはどう

var mynumbers = new Array(1,2,3,6,9,10);
var missing;

for(var i=1;i<=32;i++)
{    
   if(mynumbers[i-1] != i){
        missing = i;
        alert(missing);
        break;
   }
}
于 2013-09-17T15:17:21.000 に答える
3

によってif(mynumbers[i] - mynumbers[i-1] != 1)、シリーズは常に によって増加するということ1ですか?

var missing = (function (arr) {
    var i;
    for (i = 0; i < arr.length; ++i) {
        if (i + arr[0] !== arr[i]) return i + arr[0];
    }
    if (i < 32)            // if none missing inside array and not yet 32nd
        return i + arr[0]; // return next
}([1,2,3,6,9,10])); // 4
alert(missing);
于 2013-09-17T15:07:15.560 に答える
2

何があっても休憩は必要です。それが目的です。ループが最後まで続くのを止めます。また、32 をハードコーディングする代わりに、配列の長さを終了条件として使用する必要があります。これは、数値が 32 までしかないためですが、リストに穴がある可能性があるため、配列に 32 要素が存在しないためです。

各要素は前の要素よりも 1 多い必要があることがわかっているため、穴の数は明らかにmynumbers[i - 1] + 1です。

var mynumbers = new Array(1,2,3,6,9,10);
for(var i = 1; i < mynumbers.length; i++) {
    if(mynumbers[i] - mynumbers[i-1] != 1) {
        alert("First missing number id: " + (mynumbers[i - 1] + 1));
        break;
    }
}

編集:これは、欠落している数が1ではない場合にのみ当てはまります。それをキャッチするには、確認する必要がありますif (mynumbers[0] != 1)

于 2013-09-17T15:06:41.190 に答える
-1
for(var i = 1; i < mynumbers.length; i++) {
    if(mynumbers[i] - mynumbers[i-1] != 1) {
        alert("First missing number id: "+mynumbers[i-1]+1);
        i = mynumbers.length; // Replace the break
    }
}

必要に応じて、初期チェックを追加できます。if (mynumbers[0] != 1) { ... }

于 2013-09-17T15:05:12.117 に答える