2011-09-06 9 views
16

配列内のすべての欠損数を見つけるために配列をループ(反復)する簡単な方法を見つけるために、配列は以下のように少し見えます。配列 - 配列内に見つからない数字を見つける

var numArray = [0189459, 0189460, 0189461, 0189463, 0189465];

私は01894620189464ログアウトを必要とする上記の配列のために。

どのような考えですか?助けのための

UPDATE

おかげで、

ケネベックは、あなたの関数が最後に正常に動作させることができなかった申し訳ありません。あなたの答えの下のコメントを見てください。

EDIT:これは私がスウィアンの答えから使用した正確な解決策です。

var numArray = [0189459, 0189460, 0189461, 0189463, 0189465]; 
var mia= []; 

    for(var i = 1; i < numArray.length; i++) 
    {  
     if(numArray[i] - numArray[i-1] != 1) 
     {   
      var x = numArray[i] - numArray[i-1]; 
      var j = 1; 
      while (j<x) 
      { 
       mia.push(numArray[i-1]+j); 
       j++; 
      } 
     } 
    } 
alert(mia) // returns [0189462, 0189464] 
+0

あなたは、配列を反復処理し、それぞれ2つの要素を比較することができます。 –

答えて

21

あなたは番号がソートされ、増加していることがわかっている場合:

for(var i = 1; i < numArray.length; i++) { 
    if(numArray[i] - numArray[i-1] != 1) { 
      //Not consecutive sequence, here you can break or do whatever you want 
    } 
} 
+0

Thanks Soufianeは、配列に約100個の数字が含まれ、そこには存在しない実際の番号をどのように記録するのでしょうか、再び私は厚いかもしれないので、アレイ内の各場面をキャッチしようとしています。 –

+0

@マーク: 'numArray [i]'と 'numArray [i-1]'の間のすべての数は、その差が '1'より大きい場合、配列に含まれません。 –

+0

はい、あなたは、配列内のすべての項目を通過し、差がX(X!= 1)である場合、欠落している番号をキャッチするつもりです、あなたの欠落している番号は:numArray [i-1] + j(j> 0 and j

0

配列をソートするために、非常に簡単になります:

numArray.sort(); 

次に、最も簡単な何であったかに応じて、あなた:

  1. シーケンシャルなパターンをキャッチして、あなたが行くにつれてそれらをチェックするだけです。
  2. 配列を複数の連続した配列に分割し、それらの別々の配列をそれぞれチェックすることができます。
  3. ソートされた配列を、各ペアが開始シーケンスと終了シーケンスのペアの配列に減らし、それらのシーケンスの開始/終了を他のデータと比較することができます。
5

配列がするvar A = [0189459、0189460、0189461、0189463、0189465]

(リターン[189459,189460

interpreted-あるとき、彼らは削除されます、あなたの先行ゼロを見ます、189461,189463,189465])

function absent(arr){ 
    var mia= [], min= Math.min.apply('',arr), max= Math.max.apply('',arr); 
    while(min<max){ 
     if(arr.indexOf(++min)== -1) mia.push(min); 
    } 
    return mia; 
} 

するvar A = [0189459、0189460、0189461、0189463、0189465]。 アラート(不在(A))

/*戻り値:(配列) 189462,189464 */

+0

この関数を実行すると、次のエラーが発生します。 - TypeError 1406:変数indexOfは関数型ではありません。 –

0

私はこのために再帰関数を使用します。

function findMissing(arr, start, stop) { 

    var current = start, 
     next = stop, 
     collector = new Array(); 

    function parseMissing(a, key) { 
     if(key+1 == a.length) return; 

     current = a[key]; 
     next = a[key + 1]; 

     if(next - current !== 1) { 
      collector.push(current + 1); 
      // insert current+1 at key+1 
      a = a.slice(0, key+1).concat(current+1).concat(a.slice(key +1)); 
      return parseMissing(a, key+1); 
     } 

     return parseMissing(a, key+1); 
    } 

    parseMissing(arr, 0); 
    return collector; 
} 

膨大な数の数字を調べている場合は最適ではありません。 FAIR WARNING:再帰関数はリソースを大量に消費します(ポインタなど)。巨大な数値で作業する場合、予期しない結果が生じることがあります。 jsfiddleが表示されます。これは配列のソートを前提としています。

基本的には、使用する配列「findMissing()」関数、開始番号と停止番号を渡してそこから出させます。

ので:

var missingArr = findMissing(sequenceArr, 1, 10); 
-1

は、ここでは、あなたの順序は、常に0189455に開始すべきであることがわかっている場合たとえば、あなたの順序のための下限を指定する機能が追加されます@マーク・ウォルターズのfunctionの変種だ、または一部他の番号は1です。

このコードを調整して上限を確認することも可能ですが、現時点では下限しか検索できません。

//Our first example array. 
 
var numArray = [0189459, 0189460, 0189461, 0189463, 0189465]; 
 
//For this array the lowerBoundary will be 0189455 
 
var numArrayLowerBoundary = 0189455; 
 

 
//Our second example array. 
 
var simpleArray = [3, 5, 6, 7, 8, 10, 11, 13]; 
 
//For this Array the lower boundary will be 1 
 
var simpleArrayLowerBoundary = 1; 
 

 
//Build a html string so we can show our results nicely in a div 
 
var html = "numArray = [0189459, 0189460, 0189461, 0189463, 0189465]<br>" 
 
html += "Its lowerBoundary is \"0189455\"<br>" 
 
html += "The following numbers are missing from the numArray:<br>" 
 
html += findMissingNumbers(numArray, numArrayLowerBoundary); 
 
html += "<br><br>" 
 
html += "simpleArray = [3, 5, 6, 7, 8, 10, 11, 13]<br>" 
 
html += "Its lowerBoundary is \"1\".<br>" 
 
html += "The following numbers are missing from the simpleArray:<br>" 
 
html += findMissingNumbers(simpleArray, simpleArrayLowerBoundary); 
 

 
//Display the results in a div 
 
document.getElementById("log").innerHTML=html; 
 

 
//This is the function used to find missing numbers! 
 
//Copy/paste this if you just want the function and don't need the demo code. 
 
function findMissingNumbers(arrSequence, lowerBoundary) { 
 
    var mia = []; 
 
    for (var i = 0; i < arrSequence.length; i++) { 
 
    if (i === 0) { 
 
     //If the first thing in the array isn't exactly 
 
     //equal to the lowerBoundary... 
 
     if (arrSequence[i] !== lowerBoundary) { 
 
     //Count up from lowerBoundary, incrementing 1 
 
     //each time, until we reach the 
 
     //value one less than the first thing in the array. 
 
     var x = arrSequence[i]; 
 
     var j = lowerBoundary; 
 
     while (j < x) { 
 
      mia.push(j); //Add each "missing" number to the array 
 
      j++; 
 
     } 
 
     } //end if 
 
    } else { 
 
     //If the difference between two array indexes is not 
 
     //exactly 1 there are one or more numbers missing from this sequence. 
 
     if (arrSequence[i] - arrSequence[i - 1] !== 1) { 
 
     //List the missing numbers by adding 1 to the value 
 
     //of the previous array index x times. 
 
     //x is the size of the "gap" i.e. the number of missing numbers 
 
     //in this sequence.  
 
     var x = arrSequence[i] - arrSequence[i - 1]; 
 
     var j = 1; 
 
     while (j < x) { 
 
      mia.push(arrSequence[i - 1] + j); //Add each "missing" num to the array 
 
      j++; 
 
     } 
 
     } //end if 
 
    } //end else 
 
    } //end for 
 
    //Returns any missing numbers, assuming that lowerBoundary is the 
 
    //intended first number in the sequence. 
 
    return mia; 
 
}
<div id="log"></div> <!-- Just used to display the demo code -->

1

まず、シーケンス内の欠番を見つけるには、我々は配列をソートする必要があります。次に、何が欠けているかを特定することができます。ここではいくつかのテストシナリオで完全なコードを提供しています。このコードでは、負の値が渡されても正の数が見つかった場合にのみ、それが正の数を示します。

function findMissingNumber(inputAr) { 
 
    // Sort array 
 
    sortArray(inputAr); 
 

 
    // finding missing number here 
 
    var result = 0; 
 
    if (inputAr[0] > 1 || inputAr[inputAr.length - 1] < 1) { 
 
    result = 1; 
 
    } else { 
 
    for (var i = 0; i < inputAr.length; i++) { 
 
     if ((inputAr[i + 1] - inputAr[i]) > 1) { 
 
     result = inputAr[i] + 1; 
 
     } 
 
    } 
 
    } 
 
    if (!result) { 
 
    result = inputAr[inputAr.length - 1] + 1; 
 
    } 
 
    return result; 
 
} 
 

 
function sortArray(inputAr) { 
 
    var temp; 
 
    for (var i = 0; i < inputAr.length; i++) { 
 
    for (var j = i + 1; j < inputAr.length; j++) { 
 
     if (inputAr[j] < inputAr[i]) { 
 
     temp = inputAr[j]; 
 
     inputAr[j] = inputAr[i]; 
 
     inputAr[i] = temp; 
 
     } 
 
    } 
 
    } 
 
} 
 

 
console.log(findMissingNumber([1, 3, 6, 4, 1, 2])); 
 
console.log(findMissingNumber([1, 2, 3])); 
 
console.log(findMissingNumber([85])); 
 
console.log(findMissingNumber([86, 85])); 
 
console.log(findMissingNumber([0, 1000]));