вывести пропущенные последовательные числа из массива в виде диапазонов - PullRequest
0 голосов
/ 28 января 2019

Я хочу показать числа, которые не отображаются в массиве в диапазонах, массив содержит числа в диапазоне от 1 до 128.

например для массива [87,89,90,91,92,93,94,95,96,97,99]

Я хочу напечатать 1-86, 88, 98, 100-128

Я написал функцию, которая работает только когда естьнет цифр в середине первого неиспользованного числа и последнего

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]));

это результат 1-86, -88, -89, -90, -91, -92, -93, -94, -95, -96,-98, -128 для примера массива

, когда мне нужно 1-86, 88, 98, 100-128

, любая помощь приветствуется

Ответы [ 4 ]

0 голосов
/ 28 января 2019

Если массив не отсортирован, сначала отсортируйте массив, а затем выполните цикл по массиву один раз и найдите пропущенные диапазоны, сравнив предыдущее значение с текущим значением.

Ниже решение также содержит закомментированные строки для пропущенных диапазоновмассив.

Рабочий код ручки можно найти здесь .

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 голосов
/ 28 января 2019

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 голосов
/ 28 января 2019

добавьте 0 в начало, добавьте 129 в конец массива, итерируйте по элементам, если разница между соседними элементами равна 2, то выведите то, что находится между ними, если больше 2, то укажите диапазон печати. ​​

0 голосов
/ 28 января 2019

Сначала упростите код, используя метод includes(), чтобы проверить, содержит ли массив элемент.

Затем выполните это с помощью вложенных циклов.Внешний цикл ищет начало диапазона.Когда это находит, внутренний цикл ищет конец диапазона.Проверьте, одинаковы ли начало и конец, чтобы решить, выводить ли одно или два числа с - между ними.

И лучший способ создать строку с разделителями-запятыми - поместить результаты вмассив, затем используя join() в конце, чтобы объединить их.

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]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...