Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Проблема с решением задачи (циклы)

лёля Знаток (285), закрыт 4 года назад
Мне нужно из этого массива [1, 4, 5, 9, 2, 5, 1] вывести в консоль все неповторяющиеся значения - [4, 9, 2]. Я пытаюсь сделать это при помощи двух циклов.

var numbers = [1, 4, 5, 9, 2, 5, 1];

for (var i = 0; i <= numbers.length - 1; i++) {
for (var j = 0; j <= numbers.length - 1 && j != i; j++) {
if (numbers[i] != numbers[j]) {
console.log(numbers[i]);
}
}
}

Я ожидаю, что первый цикл будет по очереди сравнивать числа (i) с числами (j) из второго цикла. И я рассчитывал на 7 итераций:
1) i = 0 | j = 1; j = 2; j = 3; j = 4; j = 5; j = 6 | - в консоль не выведется
2) i = 1 | j = 0; j = 2; j = 3; j = 4; j = 5; j = 6 | - console.log(4)
3) i = 2 | j = 0; j = 1; j = 3; j = 4; j = 5; j = 6 | - в консоль не выведется
4) i = 3 | j = 0; j = 1; j = 2; j = 4; j = 5; j = 6 | - console.log(9)
5) i = 4 | j = 0; j = 1; j = 2; j = 3; j = 5; j = 6 | - console.log(2)
6) i = 5 | j = 0; j = 1; j = 2; j = 3; j = 4; j = 6 | - в консоль не выведется
7) i = 6 | j = 0; j = 1; j = 2; j = 3; j = 4; j = 5 | - в консоль не выведется

Но вместо этого получается другой результат (на скриншоте). Помогите, пожалуйста, мне разобраться, что здесь не так (если возможно, то как можно проще).
Лучший ответ
Ламзин Андрей Просветленный (35300) 4 года назад
Я бы так сделал:
let map = {}, i;
for (i = 0; i < a.length; i++) {
if (!map[ a[i] ]) {
console.log( a[i] );
map[ a[i] ] = 1;
}
}

Это тратит больше памяти чем ваш вариант, но должно работать быстрее.
Остальные ответы
クマのプーさん Мудрец (15499) 4 года назад
Ошибка в том, что число выводится сразу, как только встретит непохожее на себя
А надо в случае нахождения пропустить это число и вывести только тогда, когда проверены все варианты (и не налось пересечения)
Юрий Семыкин Искусственный Интеллект (187412) 4 года назад
Перед первым (внешним циклом) отсортируйте массив numbers.sort()
Больше, вроде, ничего можно не менять.
В сортированном массиве можно обойтись одним циклом.
Ну, или хорошее решение Ламзин Андрей предложил, ясное и простое.
Elepsis Eclipse Гений (64071) 4 года назад
Не так вы представляете циклы... оно просто берет и кругами выполняет то, что написано внутри.

var numbers = [1, 4, 5, 9, 2, 5, 1];

for (var i = 0; i < numbers.length; i++) {
  for (var j = 0; j < numbers.length && j != i; j++) {
    if (numbers[i] != numbers[j]) {
      console.log(numbers[i]);
    }
  }
}

Запускается код для i = 0;

Внутри которого начинается новый цикл, который кругами выводит числа в консоль и не срабатывает только на j == i, т. е. 0.

numbers[i] внутри этого цикла пока всегда будет == 1

А оставшиеся элементы массива выведутся по очереди: 4, 5, 9, 2, 5

Не выводится только последняя единичка, т. к. numbers[j] == numbers[i] == 1

Запускается следующий круг для i = 1.

И очереднй цикл j - от нуля до .length и т. д... оттуда и дофига результатов.

Цикл можно прервать через ключевое слово break; но он тут не поможет.
______________

Можно решить так - https://jsfiddle.net/OPTlMUS/1pkcdqxs/ , из массива собрать строку и через регулярку проверить - сколько раз в нем попадается очередной эелемнт. А если совпадение всего одно - уникальный элемент, добавить в новый массив.
Молот Шотландцев Высший разум (300965) 4 года назад
Как раз недавно выкладывал свой вариант решения вложенным циклом
var a = [5,8,4,3,9,5,1,6,3,5,2,8,7,4,5,3,0,5,6,6];
console.log(a);
var b = [];
for (var i = 0; i < a.length; i++) {
for (var j = 0; j < a.length; j++) {
if (i == j) {
continue;
}
if (a[i]==a[j]) {
b.push(a[i]);
var n = a[i];
}
for (var k = 0; k < a.length; k++) {
if (a[k] == n) {
a.splice(k, 1);
}
};
};
};
console.log('не повторяются ' + a);
console.log('повторяются ' + b);
____
5,8,4,3,9,5,1,6,3,5,2,8,7,4,5,3,0,5,6,6
не повторяются 9,1,2,7,0
повторяются 5,8,3,6,4
Похожие вопросы