删除数组中的双元素

时间:2019-10-09 04:34:12

标签: c++

我正在尝试删除数组中的双精度元素。我开发了一个简单的代码,但仍然无法正常工作。是否有可能暗示一些我可能没有尝试过的输入。我尝试过角落和测试用例。以下是问题陈述:

给出的数字序列。删除元素的双打,保留第一份副本。

输入:包含自然n(n≤100000)–序列中的n个数量数字,然后包含n个非负数–序列中模块不大于999的元素。

输出:更改顺序。

似乎我听不清是什么问题

#include <iostream>
//#include <cmath>
//#include <climits>
#define SIZE 100000

using namespace std;
int main()
{
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int n, k, p;
    bool tag; tag = false;
    cin >> n;
    long long int *a = new long long int[n];
    long long int b[SIZE];

    for (int i = 0; i < n; i++) { cin >> a[i]; }

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

        for (int j = i + 1; j < n; j++) {
            if (a[i] == a[j]) { b[k] = j-k; k++; tag = true; }
        }
        if (tag) {
            for (int i = 0; i < k; i++) { 
                p = b[i];
                for (int i = p; i < n; i++) { a[i] = a[i + 1]; }
                n--;
            }
            tag = false;
        }

    }
    for (int i = 0; i < n; i++) { cout << a[i] << " "; }
    return 0;
}

输入:6 1 2 2 4 3 4输出:1 2 4 3

4 个答案:

答案 0 :(得分:0)

这是我的O(n)复杂度版本。您的解决方案可能超过了时限(如果太低)

bool check[2000];
for (int i = 0; i < 2000; i++) check[i] = 0; 

for (int i = 0; i < n; i++) {
  cin >> a[i];

  // +999 to avoid negative numbers
  check[a[i] + 999] = 1;
}

bool isPrint = false;
for (int i = 0; i < n; i++) {

  if (check[a[i] + 999]) {

    // mark false if already printed 
    check[a[i] + 999] = 0;

    if (isPrint) printf(" ");
    printf("%d", a[i]);

    isPrint = true;

  }

}

答案 1 :(得分:0)

您可以尝试在创建时第二个唯一数字数组。为了简单起见,我将使用向量进行演示。

    std::vector<int> v;
    for (int i = 0; i < n; i++) {
        if (std::find(v.begin(), v.end(), arr[i]) == v.end()) {
            v.push_back(arr[i]);
        }
    }

然后,您只需将向量的内容写入输出文件即可。

答案 2 :(得分:0)

您可以使用unordered_set和vector

int n; cin >> n;
long long int x;
unordered_set<long long int>myset;
vector<long long int>v1;
for (int i = 0; i < n; i++)
{
    cin>>x;
    if(myset.find(x)==myset.end())
    {
        myset.insert(x);
        v1.push_back(x);
    }
}
for(int i=0;i<v1.size();i++)
{
    cout<<v1[i]<<" ";
}

答案 3 :(得分:0)

您可以利用输入值在0 to 999范围内的优势。 如果将当前值推送到bool used[1000]{}之前,已经使用了一个简单的cout进行标记,则可以确保O(n)的复杂性和有限的内存使用(对于bool [ ]}。

以下是有关此想法的示例解决方案:

#include<iostream>

#define MAX_VALUE 999

using namespace std;

int main() {
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);

  bool used[MAX_VALUE + 1]{};

  size_t n;
  cin >> n;

  for (size_t num, i = 0; i < n; ++i) {
    cin >> num;

    if (!used[num]) {
      cout << num << " ";
      used[num] = true;
    }
  }

  return 0;
}