Количество разных чисел в массиве c++

280
16 марта 2017, 23:00

Есть целочисленный массив, как найти количество разных чисел в нем? Собственно, как функцию сравнения (проверку) правильно задать, вот эту: if ((arr[i]!=arr[i-1])), чтоб считало нормально.

#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
    int N;
    int count = 0;
    cout << "vvedite kolichestvo elem ";
    cin >> N;
    cout << "vvedite massiv:" << endl;
    int arr[N];
    for (int i = 0; i < N; i += 1)
    {
        cout << "arr[" << i << "] = ";
        cin >> arr[i];
    }
    for (int i = 0; i < N; i += 1)
    {
        if ((arr[i] != arr[ i - 1 ]))
        {
            count += 1;
        }
    }
    cout << "kolichestvo raznih" << count << endl;
    system("pause");
    return 0;
}
Answer 1

А так нельзя

std::unorered_set<int> s;
std::copy(std::begin(arr), std::end(arr), std::inserter(s, s.begin()));
std::cout << "kolichestvo raznih" << s.size() << std::endl;

?

Или

std::sort(std::begin(arr), std::end(arr));
int count = std::unique(std::begin(arr), std::end(arr)) - std::begin(arr);
std::cout << "kolichestvo raznih" << count << std::endl;

?

Если уж совсем "в лоб" решать, то, например, так

int count = 0;
for (int i = 0; i < N; ++i)
{
  int j;
  for (j = i + 1; j < N && arr[j] != arr[i]; ++j);
  count += j == N;      
}
std::cout << "kolichestvo raznih" << count << std::endl;

Это, конечно, неинтересное решение, но зато цикл for с пустым телом удалось применить :)

Вообще-то

int N;
...
int arr[N];

в С++ не допускается.

Answer 2

Раз речь пошла о циклах, то я вам покажу, как надо писать циклы!:)

#include <iostream>
int main()
{
    int a[] = { 0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0 };
    const size_t N = sizeof(a) / sizeof(*a);
    size_t count = 0;
    for (size_t i = 0; i < N; i++)
    {
        size_t j = 0;
        while (j < i && a[j] != a[i]) ++j;
        count += j == i;
    }
    std::cout << count << std::endl;
}

Или более содержательная программа

#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
    const size_t N = 20;
    int a[N];
    std::srand((unsigned int)std::time(nullptr));
    for ( int &x : a ) x = std::rand() % N;
    for (int x : a) std::cout << x << ' ';
    std::cout << std::endl;
    size_t count = 0;
    for (size_t i = 0; i < N; i++)
    {
        size_t j = 0;
        while (j < i && a[j] != a[i]) ++j;
        count += j == i;
    }
    std::cout << "There are " << count << " unique elements" << std::endl;
}

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

10 17 12 15 5 1 17 19 0 6 13 5 4 13 6 4 18 10 5 11
There are 13 unique elements
Answer 3

Упорядочить массив сортировкой Хоара или Шелла и пройтись по нему циклом.

READ ALSO
Отличия в оптимизации C и C++

Отличия в оптимизации C и C++

Какой код компилируется Си и С++, корректно работает, но при этом может отличается по быстродействию вследствие различий стандартов C и C++?

229
Передача объекта в функцию по значению

Передача объекта в функцию по значению

Можно ли передать объект в функцию по значению, а не по ссылке? Например, если передаем массив в рекурсивную функцию, и на каждом вызове из этого...

264
Как передать компонент через рутер в ReactJS?

Как передать компонент через рутер в ReactJS?

В приложении есть зарегестрирвоанные и незарегестрированные пользователиСоответственно для тех и для других будут разные хедеры на сайте(хедеры...

319
Оптимизация JavaScript кода

Оптимизация JavaScript кода

Все изумительно работает , но можно как то оптимизировать подобный код ? Знаний JS не достаточно , а таких скриптов штук 20 на странице( И кажутся...

344