Дан отсортированный по возрастанию массив 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;
}
}
}
Он же отсортированный - выводить нужно только смены значений:
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," "));
Продолжая хороший ответ от Harry, если пользоваться стандартными альгоритмами, то проще:
unique_copy(begin(a), end(a), ostream_iterator<int>(cout, " "));
Предлагаю реализацию немного лучше чем у 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;
}
Можно вот так вот
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;
}
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
Сборка персонального компьютера от Artline: умный выбор для современных пользователей