Перейти к содержимому

Как найти повторяющиеся элементы в массиве c

  • автор:

Как найти повторяющиеся элементы в массивах и составить из них третий массив?

Задание: найти повторяющиеся элементы в массивах и составить из них третий массив. Мой текущий код находит только один повторяющийся элемент. Почему не находит остальные? Также непонятно, как записать полученный массив I.

#include "stdafx.h" #include #include using namespace std; int main() < int r, h, g, G[5], H[3], I[5]; r = 0; while (1) < cout > G[g]; cout > H[h]; cout else ; break; > g++; > for (r = 0;r < 3;r++) < cout ; for (g = 0;g<5;g++) < cout << G[g] << "-G-massive" << "\n"; >; for (h = 0;h<3;h++) < cout << H[h] << "-H-massive" << "\n"; >; system("pause"); > > 

введите сюда описание изображения

Отслеживать
51.4k 86 86 золотых знаков 267 267 серебряных знаков 505 505 бронзовых знаков
задан 21 ноя 2015 в 16:18
17 1 1 серебряный знак 6 6 бронзовых знаков

А почему вы пользователям вашей программы предлагаете ввести 5 элементов массива G, когда тот имеет только 4 элемента?

21 ноя 2015 в 16:21

Вы сначала, при вводе, делаете for g
21 ноя 2015 в 16:26

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Ваша программа имеет неопределенное поведение, потому что в ней происходит обращение к памяти за пределами объявленных массивов.

Например, массив G объявлен, как имеющий 4 элемента

int r, h, g, G[4], H[2], I[4]; ^^^^ 

Допустимый диапазон индексов элементов этого массива [0-3] . Однако в последующем цикле вы обращаетесь к несуществующему элементу массива с индексом 4

cout > G[g]; 

В результате чего память, не принадлежащая массиву, будет затерта.

То же самое имеет место с массивом H , который имеет всего лишь 2 элемента, и для элементов которого допустимый диапазон индексов [0-1]

Также у вас имеются ошибки в логике программы. Например после этого цикла

 for (g = 0;g<5;g++) cin >> G[g]; 

переменная g будет равной 5. Это то значение, когда цикл завершит свои итерации. Однако в последующем цикле while у вас стоит условие g < 5

while (g<5) < //. 

Очевидно, что это условие не будет истинно, и цикл ни разу не выполнится. Похоже, вы забыли инициализировать переменную g нулем заново перед этим циклом.

Кроме того, например, массив G может иметь все элементы, равные одному числу, а массив H может содержать только один элемент, равный данному значению. Однако согласно логике выполнения вашей программы, все элементы массива G будут писаться в третий массив, так как для каждого элемента массива G будет найден единственный элемент в массиве H , который равен данному значению. То есть вместо одного элемента массива G в результирующий массив запишутся все его элементы.

Кроме того вы не выводите массив I , а лишь выводите один его неинициализированный элемент, который также может оказаться за пределами массива

cout  

То есть для вывода результирующего массива вам также нужно использовать цикл, естественно, правильно указав диапазон допустимых индексов.

Как найти одинаковые элементы в массиве js?

Для нахождения одинаковых элементов можно использовать следующий алгоритм:

  1. Находим количество вхождений (сколько раз встречается в списке) для каждого элемента
  2. Выводим только те, у которых количество вхождений больше 1

Алгоритм можно реализовать с помощью цикла:

const numbers = [4, 3, 3, 1, 15, 7, 4, 19, 19]; // исходный массив const countItems = <>; // здесь будет храниться промежуточный результат // получаем объект в котором ключ - это элемент массива, а значение - сколько раз встречается элемент в списке // например так будет выглядеть этот объект после цикла: // // 1 встречается в тексте 1 раз, 2 встречается 2 раза, 4 встречается 2 раза и так далее for (const item of numbers)  // если элемент уже был, то прибавляем 1, если нет - устанавливаем 1 countItems[item] = countItems[item] ? countItems[item] + 1 : 1; > // обрабатываем ключи объекта, отфильтровываем все, что меньше 1 const result = Object.keys(countItems).filter((item) => countItems[item] > 1); console.dir(result); // => ['3', '4', '19'] 

20 октября 2022

Найти повторяющиеся значения в массиве можно, используя метод indexOf() и функцию высшего порядка filter:
Рассмотрим пример:

const values = [1, 100, 5, 6, 13, 13, 22, 5]; // предположим, что у нас есть числовой массив const duplicates = values.filter((number, index, numbers) =>  console.log(number); // number - элемент массива console.log(index); // index - индекс элемента массива console.log(numbers); // numbers - представление массива values return numbers.indexOf(number) !== index; >); 

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

console.log(duplicates); // => [ 13, 5 ] 

Всё получилось! В массив duplicates вернулись дубликаты.

Документация:
  • indexOf()

Проверить есть ли в массиве одинаковые числа

1. Отсортировать массив.
2. В цикле со второго элемента массива по количество элементов условие:
Если А[n] = A[n-1] Тогда есть совпадение и возврат.
Если весь цикл прошли, значит совпадений нет.

Код сами напишите или денег заплатите?

DarkKnight
#include using namespace std; void main() < int a[8], b=0; int i,j,c=0; bool ex=false; for ( i=0; i> a[i]; //осуществляем ввод //for ( j=0; j //тут можно сразу выйти и не ждать ввода оставшихся элементов //для этого просто включить проверку переменной ex // if (ex) break; //но если нужно все же все элементы ввести, можно и не ставить, хотя рез. уже известен > if(ex) cout

1. Отсортировать массив.
Код сами напишите или денег заплатите?
Посмотрите его код, он его написал почти правельный. С небольшим недочетом, о каких деньгах речь?

vitfil

DarkKnight125, я просто отвечал на вопрос "Как можно проверить есть ли в массиве числа с одинаковым значением?", в первом посте автора. Если бы был вопрос "Что неправильно в моем коде?", стал бы смотреть код. А связи с вопросом "Как. ", посчитал остальной текст мусором. Ну что ж тут поделаешь, если у меня мусорофильтр так работает?

DarkKnight

DarkKnight125, я просто отвечал на вопрос "Как можно проверить есть ли в массиве числа с одинаковым значением?", в первом посте автора. Если бы был вопрос "Что неправильно в моем коде?", стал бы смотреть код. А связи с вопросом "Как. ", посчитал остальной текст мусором. Ну что ж тут поделаешь, если у меня мусорофильтр так работает?

Фит))) Да я тя понимаю)))) сам иной раз в шоке от прочитанного в постах после фразы "Как . ?", а ты еще и админ )))) )))) Из вопроса я бы и сам про сортировку подумал)) Если бы код его не прочитал))))
А так просто увидел, что парень не из тех, кто спрашивает то, что совсем даже близко не представляет)))
Вообще поверь, не хотел обидеть))))

Решение алгоритмических проблем: Поиск повторяющихся элементов в массиве

Этот пост является частью серии статей о том, как решать алгоритмические проблемы. Из собственного опыта, я понял, что большинство авторов просто пошагово расписывают решение проблемы. Отсутствие обобщённого представления о проблеме, не позволяет понять её и найти эффективное решение. Исходя из этого понимания, цель данной серии: описывать процессы рассуждений о том, как решать такие проблемы с нуля.

Проблема

  • Найти дубликат в массиве
Given an array of n + 1 integers between 1 and n, find one of the duplicates.If there are multiple possible answers, return one of the duplicates.If there is no duplicate, return -1.Example:Input: [1, 2, 2, 3]
Output: 2
Input: [3, 4, 1, 4, 1]
Output: 4 or 1

Процесс решения задачи

Перед тем как вы увидите решение, давайте немного поговорим о самой проблеме. У нас есть: массив n + 1 элементов с целочисленными переменными в диапазоне от 1 до n .

Например: массив из пяти integers подразумевает, что каждый элемент будет иметь значение от 1 до 4 (включительно). Это автоматически означает, что будет по крайней мере один дубликат.

Единственное исключение — это массив размером 1. Это единственный случай, когда мы получим -1.

Brute Force

Метод Brute Force можно реализовать двумя вложенными циклами:

for i = 0; i < size(a); i++ for j = i+1; j < size(a); j++ if(a[i] == a[j]) return a[i] 
>
>

O(n²) — временная сложность и O(1) — пространственная сложность.

Count Iterations

Другой подход, это иметь структуру данных, в которой можно перечитать количество итераций каждого элемента integer. Такой метод подойдёт как для массивов, так и для хэш-таблиц.

Реализация на Java:

Мы проходим через каждый элемент и помечаем соответствующий индекс, прибавляя к нему знак минус. Элемент является дубликатом, если его индекс уже помечен минусом.

Давайте рассмотрим конкретный пример, шаг за шагом:

Input: [2, 3, 3, 1]* Iteration 0: 
Absolute value = 2
Put a minus sign to a[2] => [2, 3, -3, 1]
* Iteration 1:
Absolute value = 3
Put a minus sign to a[3] => [2, 3, -3, -1]
* Iteration 2:
Absolute value = 3
As a[3] is already negative, it means 3 is a duplicate

Реализация на Java:

Такое представление даёт нам понять, что дубликат существует, когда есть цикл. Более того, дубликат проявляется на точке входа цикла (в этом случае, второй элемент).

Мы можем взять за основу алгоритм нахождения цикла по Флойду, тогда мы придём к следующему алгоритму:

  • Инициировать два указателя slow и fast
  • С каждым шагом: slow смещается на шаг со значением slow = a[slow] , fast смещается на два шага со значением fast = a[a[fast]]
  • Когда slow == fast ― мы в цикле.

Можно ли считать этот алгоритм завершённым? Пока нет. Точка входа этого цикла будет обозначать дубликат. Нам нужно сбросить slow и двигать указатели шаг за шагом, пока они снова не станут равны.

Возможная реализация на Java:

Это решение даёт результат временной сложности O(n) и пространственной O(1) и не требует изменения входящего списка.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *