Удалить из массива дубликаты элементов

Уровень сложности:

Написать функцию: int arrayUnique(int array[], int size), которая будет удалять из массива дубликаты элементов, и в конце работы вернёт новую длину массива.

Предлагаю для решения этой задачи организовать заполнение массива случайными числами. Это сократит время на ввод элементов двумерного массива. Результат работы программы показан ниже:

// new_line_array.cpp: определяет точку входа для консольного приложения.

#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;
int arrayUnique(int *ar, int);

int main(int argc, char* argv[])
{
    srand(time(NULL)); 
    const int array_size = 20; // размер массива
    const int interval = 10; // масштаб генерируемых случайных чисел
    int ar[array_size]; 

    for (int counter1 = 0; counter1 < array_size; counter1++)
    {
        ar[counter1] = rand() % interval; // заполняем массив случайными числами
        cout << ar[counter1] << "  "; // печать элементов массива
    }
    cout << "\n";

    for (int counter1 = 0; counter1 < arrayUnique(ar, array_size)/*вызов функции отбора значений*/; counter1++)
    {
        cout << ar[counter1] << "  "; // печать элементов массива 
    }
    cout << endl;

    system("pause");
    return 0;
}

int arrayUnique(int *ar, int size) // функция, определяющая элементы массива в единственном экземпляре
{
    for (int counter1 = 0; counter1 < size; counter1++)
    {
        for (int counter2 = counter1 + 1; counter2 < size ; counter2++)
        {
            if ( ar[counter1] == ar[counter2] ) // если найден одинаковый элемент
            {
                for (int counter_shift = counter2; counter_shift < size -1; counter_shift++)
                {
                    // выполнить сдвиг всех остальных элементов массива на -1, начиная со следующего элемента, после найденного дубля 
                    ar[counter_shift] = ar[counter_shift + 1];
                }
                size -= 1; // уменьшить размер массива на 1

                if (ar[counter1] == ar[counter2]) // если следующий элемент - дубль
                {
                 counter2--; // выполнить переход на предыдущий элемент      
                }
            }
        }
    }
    return size;
}

CppStudio.com
8  2  4  0  6  8  9  3  7  9  7  4  9  9  3  5  1  2  2  9
8  2  4  0  6  9  3  7  5  1
Следующие статьи помогут вам в решении данной задачи:
Автор: admin
Дата: 11.09.2012
Поделиться:

Комментарии

  1. art_h4rd

    art_h4rd

    void arr_uniq(int * mas, int & size)
    {
    	for (auto i = 0; i < size; i++)
    	{
    		for (auto j = 0; j < size; j++)
    		{
    			if(i != j)
    			{
    				if (mas[i] == mas[j])
    				{
    					swap(mas[size - 1], mas[j]);
    					size--;
    				}
    			}
    		}
    	}
    }
  2. iYasha

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <string>
    
    using namespace std;
    
    void printVector(const vector<int>& a) {
      cout << endl;
      for (auto i : a) {
        cout << i << ' ';
      }
      cout << "\nsize a == " << a.size() << endl;
      cout << endl;
    }
    
    int main() {
      vector<int> nums;
      vector<int> end_nums;
      bool nums_0 = true, nums_1 = true, nums_2 = true, nums_3 = true, nums_4 = true, nums_5 = true;
      bool nums_6 = true, nums_7 = true, nums_8 = true, nums_9 = true;
      for (int i = 0; i < 10; i++) {
        nums.push_back((rand() % 9)/2);
      }
      printVector(nums);
      for (int i = 0; i < nums.size(); i++){
        if (nums[i] == 0 && nums_0 == true) {
          end_nums.push_back(0);
          nums_0 = false;
        }
        if (nums[i] == 1 && nums_1 == true) {
          end_nums.push_back(1);
          nums_1 = false;
        }
        if (nums[i] == 2 && nums_2 == true) {
          end_nums.push_back(2);
          nums_2 = false;
        }
        if (nums[i] == 3 && nums_3 == true) {
          end_nums.push_back(3);
          nums_3 = false;
        }
        if (nums[i] == 4 && nums_4 == true) {
          end_nums.push_back(4);
          nums_4 = false;
        }
        if (nums[i] == 5 && nums_5 == true) {
          end_nums.push_back(5);
          nums_5 = false;
        }
        if (nums[i] == 6 && nums_6 == true) {
          end_nums.push_back(6);
          nums_6 = false;
        }
        if (nums[i] == 7 && nums_7 == true) {
          end_nums.push_back(7);
          nums_7 = false;
        }
        if (nums[i] == 8 && nums_8 == true) {
          end_nums.push_back(4);
          nums_8 = false;
        }
        if (nums[i] == 9 && nums_9 == true) {
          end_nums.push_back(9);
          nums_9 = false;
        }
      }
      printVector(end_nums);
      return 0;
    }
  3. Максим Квачёв

    /*
     * Created by IrishSilvan at 06.08.2016
     * This program delete repeating elements from random matrix
     */
    
    #include <iostream>
    #include <iomanip>
    #include <windows.h>
    
    using namespace std;
    
    //Прототипы функций
    void random_massive(int, int, int);
    int random_number(int, int);
    void print_massive(int);
    int find_repeat(int*, int);
    
    int massive[20]; //Матрица 10x1
    
    int main() {
        SetConsoleCP(1251);
        SetConsoleOutputCP(1251);
        cout << fixed; // Отображение чисел в ненаучной форме
        cout << setprecision(0); //Устанавливаем точность для всех выводимых чисел
        srand((unsigned int) time(NULL)); //Для полной рандомизации генерируемых чисел
        int n0, n1; //Переменные диапазона чисел
        int size0 = 0;
        cout << "Введите размер матрицы: ";
        cin >> size0;
        if(size0 <= 0){
            cout << "Вы ввели недопустимый размер матрицы" << endl;
            system("pause");
            return 0;
        }
        cout << "Введите диапазон генерируемых чисел" << endl;
        cout << "Укажите нижний предел: ";
        cin >> n0;
        cout << "Укажите верхний предел: ";
        cin >> n1;
        if(n0 == n1){
            cout << "Вы задали одинаковые диапазоны" << endl;
            system("pause");
            return 0;
        }
        random_massive(n0,n1, size0); //Вызов функции генерации массива по заданным параметрам
        cout << "Матрица:" << endl;
        print_massive(size0); //Вызов функции вывода готового массива на экран
        cout << endl;
        int size1 = find_repeat(massive, 20);
        print_massive(size1);
        cin >> n0;
        return 0;
    }
    
    //Функция - Генератор массива со случайными числами
    void random_massive(int a, int b, int size)
    {
        for(int i = 0; i < size; i++) { //Перебираем элементы в строке по индексам до 10го
            massive[i] = random_number(a, b); //Запись в массив случайного числа
        }
    }
    
    //Функция - Генератор случайных чисел
    int random_number(int N0, int N1)
    {
        int spray = N1 - N0; //Вычисление диапазона допустимых чисел
        int number = (N0 + (rand() % spray)); //Складываем все вместе и получаем случайное число в заданном диапазоне
        return number; //Возвращаем случайное число с дробной частью
    }
    
    //Функция - Вывод массива на экран в удобной для чтения форме
    void print_massive(int size)
    {
        for(int i = 0; i < size; i++) { //Перебираем элементы в строке по индексам до 10го
            cout << massive[i] << " "; //Выводим каждый элемент отдельно пользователю. 3 знака после запятой
        }
    }
    
    //Функция - Отсеивание повторяющихся элементов массива
    int find_repeat(int *matrix, int size)
    {
        bool var;
        int temp_massive[size];
        int index = 0;
        for(int i = 0; i < size; i++) {
            int temp_el = matrix[i];
            var = true;
            for(int s = 0; (s < size) && var; s++) {
                if(temp_el == temp_massive[s]) var = false;
                else if(s == size-1) {
                    temp_massive[index] = matrix[i];
                    index++;
                }
            }
        }
        for(int i = 0; i < index; i++) {
            massive[i] = temp_massive[i];
        }
        return index;
    }
  4. Arthur

    #include<iostream>
    #include<ctime>
    #include<algorithm>
    #include<iterator>
    using namespace std;
    
    const int SZ = 20;
    int main()
    {
        int mas[SZ];
        int i   = 0;
        srand(time(0));
        for(int x = 0; x<SZ; x++)
               mas[x] =rand()%10+1;
        copy(mas, mas + SZ, ostream_iterator<int>(cout,"  "));  cout<<endl;
        for(int x = 0; x<SZ; x++)
            if(  0 == count(mas, mas+i, mas[x])  )
                mas[i++] = mas[x];
    
        copy(mas, mas + i, ostream_iterator<int>(cout,"  "));
        return 0;
    }
  5. Arthur

    #include<iostream>
    #include<ctime>
    #include <Windows.h>
    #include<algorithm>
    using namespace std;
    
    const int SZ = 20;
    
    int main()
    {
        int mas[SZ];
        srand(time(0));
        for(int x = 0; x<SZ; x++)
        {
            mas[x] =rand()%10+1;
            cout<<mas[x]<<"  ";
        }
        cout<<endl;
    
        int  i = 0;
        for(int x = 0; x<SZ; x++)
            if(  0 == count(mas, mas+i, mas[x])  )
                mas[i++] = mas[x];
    
        for(int x = 0; x<i; x++)
            cout<<mas[x]<<"  ";
        return 0;
    }
  6. Arthur

    Функция удаляет все повторяющиеся элементы

    #include<iostream>
    #include <Windows.h>
    #include <ctime>
    using namespace std;
    
    const int SZ = 20;
    int arrayUnique(int* , const int );
    int main()
    {
        int mass[SZ];
        srand(time(0));
        for(int x = 0; x<SZ; x++)
        {
             mass[x] = rand()%10 + 1;
             cout<<mass[x]<<"  ";
        }
         cout<<endl;
         int newsize = arrayUnique( mass,  SZ);
    
         for(int x = 0; x<newsize; x++)
               cout<<mass[x]<<"  ";
         return 0;
    }
    
    int arrayUnique(int* mass, const int SZ)
    {
        int x = 0;
        int newmass[SZ];
        int n  =  0;
        for(x = 0; x<SZ; x++)
        {
           bool ch = true;
    
           for(int y = x+1; y<SZ&&ch; y++)
               if(mass[x] == mass[y])
                   ch = false;
    
            for(int i = 0; i<x && ch; i++)
               if(mass[i] == mass[x])
                  ch = false;
    
            if(ch)
              newmass[n++] = mass[x];
    }
        for(int i = 0; i<n; i++)
           mass[i] = newmass[i];
       return n;
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.