4
votes

imprimer les nombres consécutifs manquants du tableau sous forme de plages

Je veux afficher les nombres qui ne s'affichent pas dans le tableau par plages, le tableau contient des nombres allant de 1 à 128.

par exemple pour le tableau [87,89,90,91,92,93 , 94,95,96,97,99]

Je veux imprimer 1-86, 88, 98, 100-128

J'ai écrit une fonction qui ne fonctionne que lorsqu'il y a aucun chiffre au milieu du premier nombre inutilisé et du dernier

function PrintPorts(ports) {
  var portString = "";
  var open = true;
  let index = 1
  for (; index < 129; index++) {
    for (let j = 0; j < ports.length; j++) {
      if (index == ports[j]) {
        open = false;
        break;
      } else
        open = true;

    }
    if (open) {
      portString += index;
      break;
    }
  }
  for (; index < 129; index++) {
    for (let j = 0; j < ports.length; j++) {
      if (index == ports[j]) {
        open = false;
        break;
      } else
        open = true;
    }
    if (!open) {
      portString += "-" + (index - 1) + ",";
    }
  }
  if (index == 129 && open) portString += "-" + (index - 1);
  return portString;
}

console.log(PrintPorts([87,89,90,91,92,93,94,95,96,97,99]));

voici le résultat 1-86, -88, -89, -90, -91, -92, -93, -94, -95, -96, -98, -128 pour l'exemple array

quand ce dont j'ai besoin est 1-86, 88, 98, 100-128

toute aide est appréciée


1 commentaires

Pas lié au problème, mais vous devriez utiliser ports.includes (index) ou ports.indexOf (index)! = -1 plutôt que d'écrire votre propre boucle.


4 Réponses :


2
votes

Tout d'abord, simplifiez votre code en utilisant la méthode includes () pour tester si un tableau contient un élément.

Ensuite, faites-le avec des boucles imbriquées. La boucle externe recherche le début d'une plage. Lorsqu'elle le trouve, la boucle interne recherche la fin de la plage. Testez si le début et la fin sont identiques pour décider s'il faut afficher un ou deux nombres avec - entre eux.

Et la meilleure façon de générer une chaîne délimitée par des virgules est en mettant les résultats dans un tableau, puis en utilisant join () à la fin pour les concaténer.

function PrintPorts(ports) {
  var openPorts = [];
  for (let index = 1; index < 129; index++) {
    if (!ports.includes(index)) {
      let startPort = index;
      for (index = startPort + 1; index < 129; index++) {
        if (ports.includes(index)) {
          break;
        }
      }
      let endPort = index - 1;
      openPorts.push(startPort == endPort ? startPort : `${startPort}-${endPort}`);
    }
  }
  return openPorts.join(",");
}

console.log(PrintPorts([87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99]));
console.log(PrintPorts([1, 2, 87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99, 120, 128]));


0 commentaires

0
votes

function PrintPorts(ports) {
	let portString = "";
	let start = 1;
  let stop = 128;
  ports.sort((a,b) => a-b)
	for (let i in ports) {
		if (start == ports[i] - 1){
    			portString += start + ","
		}
		else if(start < ports[i] - 1){
    			portString += start + "-" + String(ports[i]-1) + ",";
		}
		start = ports[i] + 1; 
	}
  if (start < stop) {
  	portString += start + "-" + String(stop);
  }
  else if (start == stop) {
  	portString += stop;
  }
  else
  	portString = portString.substring(0, portString.length-1);
	return portString;
}


console.log(PrintPorts([87,89,90,91,92,93,94,95,96,97,99]));
console.log(PrintPorts([1,3,87,89,90,91,92,93,94,95,96,97,99,128]));
console.log(PrintPorts([95,89,91,92,93,94,,87,96,97,90,99]));


0 commentaires

0
votes

ajoutez 0 au début, ajoutez 129 à la fin du tableau, parcourez les éléments, si la différence entre les éléments adjacents est de 2, alors imprimez ce qui se trouve entre les deux, s'il est supérieur à 2, affichez la plage.


0 commentaires

0
votes

Si le tableau n'est pas trié, triez d'abord le tableau, puis parcourez le tableau une fois et trouvez les plages manquantes en comparant la valeur précédente avec la valeur actuelle.

La solution ci-dessous contient également les lignes commentées pour le tableau des plages manquantes.

/ p>

Vous pouvez trouver le codepen de travail ici .

console.log(PrintPorts([87,89,90,91,92,93,94,95,96,97,99]))

function PrintPorts(ports) {
  const sorted = ports.sort(function (p1, p2) {return p1-p2} );
  const missingRanges = [];
  let missingRangesStr = ''
  let previous;
  sorted.forEach(function(p, index) {

    if(index == 0 && p > 1) {
      missingRangesStr += (1 + ' - ' + (p - 1)) + ', ';
      // missingRanges.push([1, p - 1]);
      previous = p;
      return;
    }
    if(index === (sorted.length - 1) && p !== 128) {
      // missingRanges.push([p + 1, 128]);
      missingRangesStr += (p  + 1 + ' - ' + 128) + ', ';
      previous = p;
      return;
    }

    if(previous && (previous + 1) !== p) {

      if((previous + 2) === p) {
        missingRangesStr += (previous + 1) + ', ';
        // missingRanges.push([previous + 1]);
      } else {
        missingRangesStr += (previous + 1) + '-' + (p - 1) + ', ' ;
        // missingRanges.push([previous + 1, p - 1]);
      }

    }
    previous = p;
  });
  return missingRangesStr.replace(/(,\s)$/, ''); 
}


0 commentaires