как удалить повторяющиеся числа из массива и изменить размер массива до нового числа элементов в переполнении стека

я написал программу, которая случайным образом генерирует числа (от 1 до 15) для целочисленного массива размером 17. После заполнения массива этими числами он сортирует массив в порядке убывания.

Теперь я хочу удалить повторяющиеся числа из массива и изменить размер массива до нового количества элементов. Но я не знаю, как это сделать. Любая помощь будет принята с благодарностью. Благодарю вас.

Вот мой код:

#include "stdafx.h"#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;int _tmain(int argc, _TCHAR* argv[])
{
const int arraySize = 17;
int RandomNumbers[arraySize];
int insert; // temporary variable to hold element to insert

srand(time(0));

cout<<"Before Sorting :"<<endl;
for (int i=0; i<17; i++)
{
RandomNumbers[i]= 1+rand()%15;
cout<<RandomNumbers[i]<<" , ";
}
cout<<endl;
cout<<endl;

for (int next = 1; next < arraySize; next++)
{
insert = RandomNumbers[next]; // store the value in the current element
int moveItem = next; //initialize location to place element

//search for the location in which to put the current element
while ((moveItem >0) &&(RandomNumbers[moveItem -1]< insert) )
{
//shift element one slot to the right
RandomNumbers[moveItem] = RandomNumbers[moveItem -1];
moveItem--;
} //end while
RandomNumbers[moveItem]= insert; //place inserted element into the array
} //end for

cout << "After Sorting :"<<endl;

// output sorted array
for (int j =0; j < arraySize; j++)
{cout<<RandomNumbers[j]<<" , ";
}
cout<<endl;
return 0;
}

Вот мой вывод:

Перед сортировкой:
13, 14, 5, 12, 7, 3, 9, 15, 12, 3, 3, 13, 13, 3, 3, 10, 4,

После сортировки:
15, 14, 13, 13, 13, 12, 12, 10, 9, 7, 5, 4, 3, 3, 3, 3, 3,
Нажмите любую клавишу для продолжения . , ,

2

Решение

Да, и если вы не хотите использовать stdэто фрагмент кода, который я только что написал. Работает нормально:

const int length = 5;
int arr[length] = {2,3,2,5,1};

for(int i = 0;i < length;i++)
{
for(int j = i + 1;j < length;j++)
{
if(arr[i] == arr[j] && arr[i] != -1)
arr[j] = -1;
}
}

int count = 0;
for(int i = 0;i < length;i++)
{
if(arr[i] != -1)
count ++;
}

int *B = new int[count];
int k = 0;
for(int i = 0;i < length;i++)
{
if(arr[i] != -1)
B[k++] = arr[i];
}
for(int i = 0;i < count;i++)
{
cout << B[i] << " ";
}
0

Другие решения

Простейшая форма будет использовать std::vector с std::sort а также std::vector::erase+std::unique

#include <algorithm>
#include<vector>
#include<iterator>

template <typename T>
void eliminate_duplicates(std::vector<T>& vec)
{
std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());
}

template <typename T>
void display(std::vector<T>& vec)
{
std::copy(vec.begin(),
vec.end(),
std::ostream_iterator<T>(std::cout," ") );
}

std::vector<int> RandomNumbers;
for (int i=0; i<17; i++)
RandomNumbers.push_back(1+rand()%15);

display(RandomNumbers);

eliminate_duplicates(RandomNumbers);

display(RandomNumbers);
3

Вы можете попробовать использовать std :: list, который позаботится о размере для вас.
Если это вектор целых чисел, вы можете иметь сортировку «бесплатно» уже через std :: sort.

станд :: список

Затем просто пройдите по списку и удалите все дубликаты.

std::list<int>::iterator itPrev = myList.begin();
for(std::vector<int>::iterator itcurr = ++itPrev; itCurr != myList.end(); ++itCurr)
{
if(*itPrev == *itCurr)
{
myList.erase(itCurr);
}
++itPrev;
}
0
По вопросам рекламы [email protected]