Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 28.06.2014
Сообщений: 5
1

Массив. Удалить из исходного массива уникальные (не повторяющиеся) элементы

28.06.2014, 16:51. Показов 3919. Ответов 16
Метки нет (Все метки)

Вводится длина одномерного массива и значения его элементов. Удалить из исходного массива уникальные (не повторяющиеся) элементы. Результат вывести.
вот мой результат . только вот в чем проблема, числа не удаляются , а в выводе числа идут по порядку. Пожалуйста срочно нужна помощь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <conio.h>
int main()
{
int N;
cout << "Enter number of elements:" <<endl;
cin >> N;
int *mas1 = new int [ N ];
int *mas2 = new int [ N ];
 
cout << endl << "Input elements:" << endl;
for ( int i = 0; i < N; i++ )
cin >> mas1[i];
 
int k = 0;
bool flag;
 
for ( int i = 0; i < N; i++ )
{
flag = false;
for ( int j = i+1; j < N; j++)
if ( mas1[i] == mas1[j] )       flag = true;
if (!flag)
mas2[k++] = mas1[i];
}
cout << endl << "Output: " <<endl;
for (  int i = 0; i < k; i++ )
cout << mas2[i] << "\t";
delete [] mas1;
delete [] mas2;
 
getch();
 
return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2014, 16:51
Ответы с готовыми решениями:

Из заданного массива удалить уникальные (не повторяющиеся) элементы, являющиеся совершенными числами
Написать программу. Дан одномерный массив А. Из этого массива удалить уникальные ( не...

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

Как удалить из исходного массива не повторяющиеся элементы?
Вводится длина одномерного массива и значения его элементов. Удалить из исходного массива...

Массив. Удалить из массива все повторяющиеся элементы.
В основной программе описать массив целых чисел размерности n. Размерность массива запрашивать с...

16
30 / 30 / 32
Регистрация: 21.06.2014
Сообщений: 81
28.06.2014, 19:16 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <conio.h>
#include <iostream>
using namespace std;
int main()
{
int N;
cout << "Enter number of elements:" <<endl;
cin >> N;
int *mas1 = new int [ N ];
 
 
cout << endl << "Input elements:" << endl;
for ( int i = 0; i < N; i++ )
cin >> mas1[i];
 
for(int j,i=0;i<N;i++)
{
    for(j=i+1;j<N;j++)
    {
        if(mas1[i]==mas1[j])
            break;
    }
    if(j==N)
    {
        for(j=i;j<N-1;j++)
        {
            mas1[j]=mas1[j+1];
        }
        i--;
        N--;
 
    }
}
 
 
cout << endl << "Output: " <<endl;
for (  int i = 0; i < N; i++ )
cout << mas1[i] << "\t";
delete [] mas1;
 
getch();
 
return 0;
}
0
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
28.06.2014, 19:30 3
O(n2) плохо.
На вскидку есть способ n*log(n)
0
220 / 165 / 47
Регистрация: 17.07.2012
Сообщений: 587
28.06.2014, 19:43 4
это скорее всего задачка по практике по проге с универа, так что нормал!
0
What a waste!
1604 / 1297 / 179
Регистрация: 21.04.2012
Сообщений: 2,723
28.06.2014, 20:25 5
Цитата Сообщение от Kukurudza Посмотреть сообщение
На вскидку есть способ n*log(n)
С сохранением оригинального порядка?
0
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
28.06.2014, 20:28 6
да(еще одын симвал)
0
What a waste!
1604 / 1297 / 179
Регистрация: 21.04.2012
Сообщений: 2,723
28.06.2014, 20:41 7
Цитата Сообщение от Kukurudza Посмотреть сообщение
да(еще одын симвал)
) И какой?
0
710 / 282 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
28.06.2014, 20:47 8
Очевидно, что используя любую стабильную сортировку со сложностью n log n
0
What a waste!
1604 / 1297 / 179
Регистрация: 21.04.2012
Сообщений: 2,723
28.06.2014, 20:56 9
Цитата Сообщение от Voivoid Посмотреть сообщение
Очевидно, что используя любую стабильную сортировку со сложностью n log n
Обратно то как порядок восстановить? янп
0
220 / 165 / 47
Регистрация: 17.07.2012
Сообщений: 587
28.06.2014, 22:36 10
можно идти по массиву, кидать числа в сет, и не добавлять в результат, если оно уже есть в сете.

или если числа маленькие вообще можно за O(n) решить!
0
Заблокирован
29.06.2014, 04:12 11
Цитата Сообщение от Freemen_ Посмотреть сообщение
Удалить из исходного массива
Цитата Сообщение от BatonPro Посмотреть сообщение
N--;
Это - не удаление.

Цитата Сообщение от SlavaSSU Посмотреть сообщение
можно идти по массиву, кидать числа в сет, и не добавлять в результат, если оно уже есть в сете.
Тогда там будут уникальные элементы и по одному не уникальному. Оно нам надо?

ИМХО, суть задачи в том, чтобы уметь ручками удалять элементы из динамического массива, преобразовывая его размерность.
0
382 / 280 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
29.06.2014, 05:22 12
можно добавить все элементы массива в std::unordered_multiset, а потом проходя по этому множеству выудить все элементы, для которых std::unordered_multiset::count вернула > 1
0
Заблокирован
29.06.2014, 05:27 13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//Удалить из исходного массива уникальные (не повторяющиеся) элементы
#include <iostream>
#include <iomanip>
 
//----------------------------------ручной ввод num в пределах lower < num < upper
template <typename T>
void SafeInput (T &num, T lower, T upper)
{
    while (!(std::cin >> num) || !(std::cin.peek() == '\n' || std::cin.peek() == '\t' || std::cin.peek() == ' ') 
                    && num > lower && num < upper)
    {
        std::cin.clear();
        while (std::cin.get() != '\n');
        std::cout << "Ошибка. Попробуйте снова\n";
    }
}
 
//----------------------------------ручной ввод num
template <typename T>
void SafeInput (T &num)
{
    while (!(std::cin >> num) || !(std::cin.peek() == '\n' || std::cin.peek() == '\t' || std::cin.peek() == ' '))
    {
        std::cin.clear();
        while (std::cin.get() != '\n');
        std::cout << "Ошибка. Попробуйте снова\n";
    }
}
 
//----------------------------------создаем массив с ручным вводом
double *CreateArray (int N)
{
    double *arr = new double [N];
    for (int i = 0; i<N; i++)
        SafeInput<double>(arr[i]);
 
    return arr;
}
 
//---------------------------------обертка для очистки памяти
void DeleteArray( double *arr)
{
    delete [] arr;
}
 
//----------------------------------смотрим на массив
void PrintArray (double *arr, int N)
{
    for (int i = 0; i<N; i++)
        std::cout << std::fixed << std::setw(7) << std::setprecision (3) << *(arr+i) << "\n";
}
 
//---------------------------------является ли уникальным элемент на позиции pos
bool IsUnique (double *arr, int N, int pos)
{
    if (pos < 0 || pos > N-1)
        return false;
 
    for (int i = 0; i<N; i++)
        if ( i != pos && *(arr+i) == *(arr+pos))
            return false;
 
    return true;
}
 
//---------------------------------удаляем элемент на позиции pos
bool Erase (double *arr, int &N, int pos)
{
    if (pos < 0 || pos > N-1)
        return false;
    
    if (N == 1)
    {
        DeleteArray (arr);
        arr = NULL;
        N = 0;
        return true;
    }
 
    double *temp = new double [N-1];
    int i = 0;
    for ( ; i<pos; i++)
        *(temp+i) = *(arr+i);
    for ( ; i<N-1; i++)
        *(temp+i) = *(arr+i+1);
 
    DeleteArray (arr);
    arr = NULL;
    arr = new double [N-1];
    for (i = 0 ; i<N-1; i++)
        *(arr+i) = *(temp+i);
    N--;
    DeleteArray (temp);
 
    return true;
}
 
//--------------------------------собственно, задача
void Task (double *arr, int &N)
{
    for (int i = 0; i<N; i++)
        if (IsUnique(arr, N, i))
        {   
            Erase (arr, N, i);
            i--;
        }
}
 
//----------------------------------------------------------------------------
int main()
{   
    setlocale (LC_CTYPE, "Russian");
 
    int N;
    std::cout << "Размерность массива N = ";
    SafeInput<int> (N, 0, 21); // 0 < N < 21
 
    std::cout << "Введите массив:\n";
    double *arr = CreateArray (N);
    std::cout << "Массив:\n";
    PrintArray (arr, N);
 
    Task(arr,N);
    std::cout << "\nПосле удаления уникальных элементов:\n";
    PrintArray (arr, N);
 
    if (N)
        DeleteArray(arr);
    
    std::cin.sync();    
    std::cin.get();
    return 0;
}
0
What a waste!
1604 / 1297 / 179
Регистрация: 21.04.2012
Сообщений: 2,723
29.06.2014, 05:39 14
У меня до сих пор вопрос: как выделить все повторяющиеся элементы, сохранив при этом их порядок, за O(n*log(n))?
0
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
29.06.2014, 06:15 15
gray_fox.
1. за каждым элементом в массиве закрепляем его порядковый номер O(n)
2. сортируем по величине элементу O(n * log(n))
3. проходим по отсортированному массиву и удаляем элемент, если его соседи ему не равны O(n)
4. заново сортируем по порядковому номеру O(n * log(n))
Итого: O(n) + O(n * log(n)) + O(n) + O(n * log(n)) = 2 * O(n * log(n)) = O(n * log(n))
2
gray_fox
29.06.2014, 06:25
  #16

Не по теме:

Kukurudza, Иа и диод)

0
220 / 165 / 47
Регистрация: 17.07.2012
Сообщений: 587
29.06.2014, 13:20 17
IrineK, ой да, а вчера понял задачу как "удалить из массива элементы так, чтобы каждый остался в 1 экземпляре"...

ну тогда наоборот кидать в результат, если оно уже есть, и в конце еще по одному экземпляру добавить.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2014, 13:20

Удалить все повторяющиеся элементы массива, и упорядочить массив
Удалить все повторяющиеся элементы массива. Пример массив 1 2 2 3 4 5 5 7 8 1 2. Должно выйти 3 4 7...

Разработать программу для создания нового массива, содержащего повторяющиеся элементы исходного массива
Есть псевдокод. Возможно он не правильный ( я же состовлял.) Помогите сделать программу на паскале...

Как реализовать функцию, которая принимает и возвращает в массив уникальные значения из исходного массива
Объясните пожалуйста, как реализовать функцию uniq, которая принимает, как аргумент, массив, и...

Удалить из массива повторяющиеся элементы
Удалить из массива повторяющийся элементы,оставив только из первые вхождения!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.