Szukanie takich samych elementów w tablicy

0

Witam. Potrzebuje pomocy, nie wiem jak to ugryźć ;) Mam tablice składająca się z n elementów i muszę znaleźć takie same elementy w tablicy i wypisać je .np, mam 3,1,5,5,8,5 to program ma wypisać 5 5 5. Coś tu robię nie tak, próbowałem na parę sposobów ale albo nie wyświetla pierwszej albo ostatniej z pary (o 1 mniej) lub problem zaczynał się od 3 liczby takiej samej.
Z góry dziękuje za pomoc ! :)

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
int n=15;
int tab[n]={3,4,5,3,5,2,2,4,4,5,4,5,5,1,17};
int x,licznik=1;

for(int i = 0; i < n; i++)
{
x=0;
for(int j = 0; j < licznik; j++)
{
    if(tab[i]==tab[j]){
    x=1;
    cout << tab[i] << " Ideks i " << i<< endl;
    }

}
    if(x<=0){
        tab[licznik]=tab[i];
        licznik++;
    }
}
}
1

Wiele jest niewiadomych w tym zadaniu...

  1. Jakiego wyniku spodziewasz się po tablicy w swoim kodzie?
    Przykład, który podałeś nad kodem, uwzględnia tylko jedną powtarzającą się liczbę. To za mało, żeby powiedzieć, czego się spodziewasz...
  2. Czy program ma wyświetlać tylko liczby, które się powtarzają, czy może wszystkie liczby, z tą różnicą, że powtarzające się, są wypisywane koło siebie? Wystarczyłoby posortować tablicę.
  3. Jeśli chcesz tylko powtarzające się liczby, to polecam std::map, zrobisz sobie liczniki dla wszystkich liczb, które będziesz zwiększał o 1 w zależności od wystąpień poszczególnych liczb - kluczy. Potem tylko wypiszesz odpowiednią ilość liczb dla każdego klucza, którego wartość przekracza 1. Np. przy liczbie (kluczu) 5 będziesz miał wartość 3, więc wypiszesz 3 razy 5 -> 555.
0
  1. W moim kodzie wypisze liczby powtarzające się w tablicy ale będzie zawsze brakować jednej cyfry. Faktycznie przykład podałem tylko dla jednej liczby - mój błąd ;) Chodzi o to jak mam tablice 3,4,5,3,5,2,2,4,4,5,4,5,5,1,17 to program wypisze np. 3,3,4,4,4,4,5,5,5,5,5,2,2(kolejność wyświetlania cyfr mało ważna) w późniejszej wersji chciałbym wypisać indeks każdej z tych powtarzających się liczb ;)
  2. Program ma wyświetlać tylko liczby które się powtarzają. Sortowanie raczej odpada bo potem chciałbym wyciągać indeksy powtarzających się liczb a jak posortuje to będą koło siebie.
  3. Wtedy chyba nie dam rady później dostać się do indeksów w tablicy przy tych elementach :/
4

Bracie @Cyysiek skoro chcesz zachować indeksy w oryginalnej tablicy, to twym zbawieniem będzie std::multimap. Program wykonasz takowym sposobem:

  • Jako klucze wkładasz do niej liczby znalezione w oryginalnej tablicy,a jako wartości indeksy pod którymi zostały znalezione.
  • Potem sprawdzając mapę wpierw patrzysz, czy dla danego klucza jest więcej niż jedna wartość:
  • jak jest to masz powtórzenia, a wartości mapy pokażą, na których indeksach oryginalnej tablicy występują.
  • jak nie ma to liczba z bieżącego klucza nie posiada powtórzeń.

Dla przykładowej tablicy 3,4,5,3,5,2,2,4,4,5,4,5,5,1,17 taka multimapa zostanie zbudowana:

1: 13
2: 5,6
3: 0,3
4: 1,7,8,10
5: 9,11,12
17: 14
3

https://wandbox.org/permlink/IuW32OE6ZPTPVNTe

using Container = std::unordered_map<int, std::vector<int>>;

Container loadData(std::istream &input) {
    Container result;
    int x;
    int i = 0;
    while (input >> x) {
        result[x].push_back(i++);
    }
    return result;
}
0

A nie ma jeszcze jakiegoś prostszego rozwiązania ? ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1