Лучший способ удалить неуникальные значения из массива, сохранить порядок и не использовать векторы? - PullRequest
1 голос
/ 29 мая 2020

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

Вопрос: Учитывая пример кода, заполните функцию, чтобы она возвращала только уникальные значения в массиве. Значения должны соответствовать порядку.

Пример ввода: 1, 2, 3, 10, 4, 3, 2, 10, 1, 11, 6

Пример вывода: 1 2 3 10 4 11 6

Ниже представлено мое решение, но я не могу придумать простое решение, которое не включает использование вектора для хранения уникальных значений. Тестировщику не понравилось использование вектора, поэтому я могу только предположить, что дополнительные заголовки / библиотеки были неприемлемыми. Какие-нибудь другие решения? Я предполагаю, что тестировщик искал массив для фильтрации на месте.

#include <iostream>
#include <vector> //I was not allowed to add this...

//Function to fill in...
int fxn(int *a, int size)
{
  std::vector<int> temp;
  for(int i(0); i < size; ++i)
  {
    bool found(false);
    for(auto j : temp)
    {
      if( j == a[i])
      {
        found = true;
        break;
      }
    }

    if(!found)
    {
      temp.push_back(a[i]);
    }
  }

  int *ptr_a = &a[0];
  for(auto j : temp)
  {
    *ptr_a = j;
    ++ptr_a;
  }

  return size - temp.size();
}

//The rest untochable...
void print(int *a, int size)
{
  for(int i(0); i < size; ++i)
  {
    std::cout << a[i] << " ";
  }

  std::cout << std::endl;
}

int main(void)
{

  int a[] = { 1, 2, 3, 10, 4, 3, 2, 10, 1, 11, 6 };
  int size = 11;

  int count = fxn(a, size);
  print(a, size - count);

  return 0;
}

1 Ответ

1 голос
/ 29 мая 2020

По общему признанию, эта проблема была бы проще, если бы вы могли использовать внешние библиотеки, но если вы уверены, что не можете, она все еще разрешима.

Я неправильно прочитал вопрос в первый раз. Здесь - ссылка на аналогичный вопрос.

#include<iostream>
using namespace std;

int removeDuplicates(int arr[], int n)
{
    int j = 0;

    for (int i=0; i < n; i++){
        for(int j=0;j<i;j++){

            if(arr[i]==arr[j]){
                n--;
                for (int k=i; k<n; k++){
                    arr[k]=arr[k+1];
                }
                i--;     // you forgot to decrement i
            }
        }
    }

    return n;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...