我正在尝试删除数组中的双精度元素。我开发了一个简单的代码,但仍然无法正常工作。是否有可能暗示一些我可能没有尝试过的输入。我尝试过角落和测试用例。以下是问题陈述:
给出的数字序列。删除元素的双打,保留第一份副本。
输入:包含自然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
答案 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;
}