web-dev-qa-db-ja.com

配列-シーケンスで欠落している数を見つける

私は配列をループする(反復する)簡単な方法を見つけて、シーケンス内のすべての不足している数値を見つけようとしています。配列は次のようになります。

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

上記の配列の場合、0189462および0189464ログアウトしました。

[〜#〜] update [〜#〜]:これは、私がSoufianeの回答から使用した正確なソリューションです。

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]

[〜#〜]更新[〜#〜]

これは.reduceを使用したより良いバージョンです

var numArray = [0189459, 0189460, 0189461, 0189463, 0189466];
var mia = numArray.reduce(function(acc, cur, ind, arr) {
  var diff = cur - arr[ind-1];
  if (diff > 1) {
    var i = 1;
    while (i < diff) {
      acc.Push(arr[ind-1]+i);
      i++;
    }
  }
  return acc;
}, []);
console.log(mia);
23
Mark Walters

数値が並べ替えられて増加していることがわかっている場合:

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
    }
}
31
Soufiane Hassou

ES6スタイル

var arr = [0189459, 0189460, 0189461, 0189463, 0189465]; 
var [min,max] = [Math.min(...arr), Math.max(...arr)];
var out = Array.from(Array(max-min),(v,i)=>i+min).filter(i=>!arr.includes(i));

結果:[189462、189464]

5
SammieFox

先行ゼロに注意してください。配列が解釈されると削除されます

var A = [0189459、0189460、0189461、0189463、0189465]

(Aは[189459,189460,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]; alert(absent(A))

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

5
kennebec

シーケンスで欠落している数を見つけるには、まず、配列をソートする必要があります。次に、不足している番号を特定できます。ここでは、いくつかのテストシナリオを含む完全なコードを提供しています。このコードは、欠落している正の数のみを識別します。負の値を渡しても、正の数が得られます。

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]));
4
OmChoudhary
const findMissing = (numarr) => {
  for(let i = 1; i <= numarr.length; i++) {
      if(i - numarr[i-1] !== 0) {
        console.log('found it', i)
        break;
      } else if(i === numarr.length) console.log('found it', numarr.length + 1)
    }
  };

console.log(findMissing([1,2,3,4,5,6,7,8,9,10,11,12,13,14]))
1
Famous Ketoma
const findMissing = (arr) => {
const min = Math.min(...arr);
const max = Math.max(...arr);
// add missing numbers in the array
let newArr = Array.from(Array(max-min), (v, i) => {
    return i + min
});
// compare the full array with the old missing array
let filter = newArr.filter(i => {
    return !arr.includes(i)
})
return filter;
};
1
Julian David

重複がないと仮定

let numberArray = [];

for (let i = 1; i <= 100; i++) {
  numberArray.Push(i);
}
let deletedArray = numberArray.splice(30, 1);
let sortedArray = numberArray.sort((a, b) => a - b);
let array = sortedArray;

function findMissingNumber(arr, sizeOfArray) {
  total = (sizeOfArray * (sizeOfArray + 1)) / 2;
  console.log(total);
  for (i = 0; i < arr.length; i++) {
    total -= arr[i];
  }
  return total;
}

console.log(findMissingNumber(array, 100));
0
Anu
function missingNum(nums){
    const numberArray = nums.sort((num1, num2)=>{
      return num1 - num2;
   });
   for (let i=0; i < numberArray.length; i++){
      if(i !== numberArray[i]){
        return i;
      }
   }
 }
 console.log(missingNum([0,3,5,8,4,6,1,9,7]))
0
user8459437

配列をソートするのはかなり簡単です。

numArray.sort();

次に、あなたにとって最も簡単だったものに応じて:

  1. 配列をトラバースし、順次パターンをキャッチして、それらをチェックすることができます。
  2. 配列を連続番号の複数の配列に分割し、それらの個別の配列をそれぞれチェックすることができます。
  3. 並べ替えられた配列を、各ペアが開始シーケンスと終了シーケンスであるペアの配列に減らし、それらのシーケンスの開始/終了を他のデータと比較できます。
0
jfriend00

これには再帰関数を使用します。

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

膨大な数のセットを調べている場合は、最善の方法とは言えません。公平な警告:再帰関数はリソースを大量に消費するため(ポインターなど)、膨大な数を扱う場合、予期しない結果が生じる可能性があります。 jsfiddle が表示されます。これは、配列がソートされていることも前提としています。

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

そう:

var missingArr = findMissing(sequenceArr, 1, 10);
0
newshorts

以下のコードを確認してください.....

function solution(A) {
   var max = Math.max.apply(Math, A);
   if(A.indexOf(1)<0) return 1;
   var t = (max*(max+1)/2) - A.reduce(function(a,b){return a+b});
   return t>0?t:max+1;
}
0
DJ.