web-dev-qa-db-fra.com

Tableaux - Trouver les numéros manquants dans une séquence

J'essaie de trouver un moyen facile de boucler (itérer) sur un tableau pour trouver tous les nombres manquants dans une séquence, le tableau ressemblera un peu à celui ci-dessous.

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

Pour le tableau ci-dessus, il faudrait que 0189462 et 0189464 soient déconnectés.

UPDATE: c'est la solution exacte que j'ai utilisée dans la réponse de 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]

METTRE &AGRAVE; JOUR

Voici une version plus propre utilisant .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);
20
Mark Walters

Si vous savez que les nombres sont triés et croissants:

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

Regardez vos zéros au début, ils seront supprimés lorsque le tableau sera interprété.

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

(A retourne [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]; alerte (absent (A))

/ * valeur renvoyée: (Array) 189462,189464 * /

5
kennebec

Pour trouver un numéro manquant dans une séquence, nous devons d’abord trier un tableau. Ensuite, nous pouvons identifier quel numéro est manquant. Je fournis ici le code complet avec quelques scénarios de test. Ce code identifie uniquement le nombre positif manquant. Si vous transmettez des valeurs négatives, il donne un nombre positif.

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]));
3
OmChoudhary
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
Eye Sun

Il serait assez simple de trier le tableau:

numArray.sort();

Ensuite, en fonction de ce qui vous a le plus facilité:

  1. Vous pouvez simplement parcourir le tableau, attraper des modèles séquentiels et les vérifier au fur et à mesure.
  2. Vous pouvez diviser le tableau en plusieurs tableaux de nombres séquentiels, puis vérifier chacun de ces tableaux distincts.
  3. Vous pouvez réduire le tableau trié à un tableau de paires dans lequel chaque paire est une séquence de début et de fin, puis comparer le début/la fin de la séquence à vos autres données.
0
jfriend00

J'utilise une fonction récursive pour cela.

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

Ce n’est pas la meilleure idée si vous examinez un grand nombre de chiffres. AVERTISSEMENT FAIR: les fonctions récursives utilisent beaucoup de ressources (pointeurs et autres) et peuvent vous donner des résultats inattendus si vous travaillez avec des nombres énormes. Vous pouvez voir le jsfiddle . Cela suppose également que vous avez trié le tableau.

En gros, vous transmettez à la fonction "findMissing ()" le tableau que vous voulez utiliser, le nombre de départ et le nombre d'arrêt, et vous le laissez partir de là.

Alors:

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

S'il vous plaît vérifier le code ci-dessous .....

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.