Вывести массив чисел без повторений

143
24 июня 2019, 11:30

Дан отсортированный по возрастанию массив C (например, {2, 2, 2, 3, 3}). Нужно вывести в консоль этот же массив C без повторений (то есть должно получиться просто 2 3).

Я, честно, пытался это сделать, но у меня всегда появляется 1-2 лишних цифры.

Есть идея формирования нового массива перебиранием каждого элемента C, но это вряд ли хорошее решение в плане скорости работы. Как лучше поступить? Могу скинуть полный исходник, если нужно.

for (int i = 0; i < size; i++) {
    for (int j = 1; j < size; j++) {
        if (C[i] != C[j]) {
            cout << C[j] << " ";
            i++;
            break;
        }
    }
}
Answer 1

Он же отсортированный - выводить нужно только смены значений:

int main(int argc, const char * argv[])
{
    int a[] = {1,1,1,2,2,3,4,5,5,5,5,6,7,8,8,8};
    cout << a[0] << " ";
    for(int last = a[0], i = 1; i < sizeof(a)/sizeof(a[0]); ++i)
    {
        if (a[i] == last) continue;
        cout << (last = a[i]) << " ";
    }
    cout << endl;
}

Или, с применением стандартной библиотеки - в одну строку:

copy(begin(a),unique(begin(a),end(a)),ostream_iterator<int>(cout," "));
Answer 2

Продолжая хороший ответ от Harry, если пользоваться стандартными альгоритмами, то проще:

unique_copy(begin(a), end(a), ostream_iterator<int>(cout, " "));
Answer 3

Предлагаю реализацию немного лучше чем у Harry

int main(int argc, const char * argv[])
{
int a[] = {1,1,1,2,2,3,4,5,5,5,5,6,7,8,8,8};
cout << a[0] << ' ';
for(int i = 1; i < sizeof(a)/sizeof(a[0]); ++i)
{
    if (a[i] !=a[i-1]) cout<<a[i]<<' ';
}
cout << endl;
}
Answer 4

Можно вот так вот

int main()
{
    int a[] = {1,1,1,2,2,3,4,5,5,5,5,6,7,8,8,8};
    cout << a[0] << ' ';
    for(int i = 1; i < sizeof(a)/sizeof(a[0]); ++i)
    {
        if (a[i] !=a[i-1]) cout<<a[i]<<' ';
    }
    cout << endl;
}
Answer 5
int array[] = { 1, 1, 2, 3, 4, 8, 8, 9, 10, 10, 10 };
for (int i = 0; i < sizeof(array) / sizeof(int); ++ i)
{
    // Начиная со второго все элементы проверяем на равенство с предыдущим, если равен, то пропускаем
    if (i > 0 && array[i] == array[i - 1])
        continue;
    std::cout << array[i] << std::endl;
}

Вывод: 1 2 3 4 8 9 10

READ ALSO
Узнать тип на этапе компиляции

Узнать тип на этапе компиляции

Можно ли определить тип переданных параметров variadic templates, на этапе компиляции?

138
Qt C++ Несколько диапазонов с разрывом в QSpinBox, QDoubleSpinBox

Qt C++ Несколько диапазонов с разрывом в QSpinBox, QDoubleSpinBox

Как в QSpinBox, QDoubleSpinBox задать некоторый множественный диапазон? Примеры как должен работать этот SpinBox, аналогично для DoubleSpinBox: 1) Должен принимать...

143
Ошибка С2065: необъявленный идентификатор

Ошибка С2065: необъявленный идентификатор

Столкнулся с проблемой, но на существующих топиках об этой проблеме не нашел решенияЯ в затруднении, все include'ы правильно расставлены вроде,...

118
сортировка std::set c++

сортировка std::set c++

у меня есть std::set с кастомным компаратором, в set я кладу свой тип данных, который содержит два параметра, уникальность должна обеспечиваться...

159