问题是,我有一个10个整数的数组,有一些重复。任务是将此数组复制到另一个大小相同但没有重复值的数组。也就是说,从array1读取一个元素,将它与array2中的所有元素进行比较,如果它已经在array2中,只需跳过它或打印它已经在array2中,转到array1的第二个元素,然后重复该过程。 现在,我试过这个,但不知道问题出在哪里:
#include <iostream>
using namespace std;
int main()
{
int temp;
int array1[] = {10,2,5,4,10,5,6,9,8,10};
int array2[11] = {0};
for(int i = 1; i <= 10; i++)
{
temp = array1[i-1];
for(int j = 1; j <= 10; j++)
{
if(temp == array2[j])
{
cout << "Duplicate " << temp << endl;
i++;
break;
}
}
array2[i] = array1[i-1];
}
for(int k = 1; k <= 10; k++)
cout << array2[k] << " " << endl;
system("pause");
}
答案 0 :(得分:3)
array1
有10个元素,array2
有11个元素,因此无法满足要求。据推测,有11个元素是在for
循环中使用不正确的索引值的解决方法;索引应该从0到9,而不是从1到10。
当您向第二个数组添加元素时,您应该只针对已添加的元素检查它的值,而不是针对整个数组中的值。
最后,还有一个不足之处。一旦消除了重复项,就会少于10个元素; array2
有10个要素;额外元素应该具有什么值?
答案 1 :(得分:1)
std :: unique_copy是你的朋友: http://en.cppreference.com/w/cpp/algorithm/unique_copy
记得首先对源数组进行排序
答案 2 :(得分:0)
您有三种方法:
O(N^2)
表现)O(N*lnN)
性能)O(1)
表现)答案 3 :(得分:0)
在C ++中,break
立即结束一个循环结构,并在它之后立即开始执行。因此,行array2[i] = array1[i-1];
无论内部for
循环是否发现重复都执行。一种解决方案是设置一个变量,指示该值是重复的:
int main() {
int temp;
bool isDuplicate; //added this line
int array1[] = {10,2,5,4,10,5,6,9,8,10};
int array2[11] = {0};
for(int i = 1; i <= 10; i++)
{
temp = array1[i-1];
isDuplicate=false;//added this line
for(int j = 1; j <= 10; j++)
{
if(temp == array2[j])
{
cout << "Duplicate " << temp << endl;
i++;
isDuplicate=true; //added this line
break;
}
}
if(!isDuplicate) //added this line
array2[i] = array1[i-1];
}
for(int k = 1; k <= 10; k++)
cout << array2[k] << " " << endl; system("pause"); }
或者(尽管许多程序员不同意这种做法)你可以使用goto
语句而不是break
语句:
int main()
{
int temp;
int array1[] = {10,2,5,4,10,5,6,9,8,10};
int array2[11] = {0};
for(int i = 1; i <= 10; i++)
{
temp = array1[i-1];
for(int j = 1; j <= 10; j++)
{
if(temp == array2[j])
{
cout << "Duplicate " << temp << endl;
i++;
goto duplicate; //added this line
}
}
array2[i] = array1[i-1];
//added next line
duplicate:
}
for(int k = 1; k <= 10; k++)
cout << array2[k] << " " << endl;
system("pause");
}
答案 4 :(得分:0)
您可以使用std :: set来确保您的唯一性。
答案 5 :(得分:0)
我可以在你的代码中看到两个主要的问题来源:1)break
语句实际上没有解决在找到重复的情况和在array1中的元素之间区分的问题应该添加到array2。 2)没有计数器可以存储到目前为止插入到array2中的元素数量,这样它们就无法复制到彼此相邻的array2。修复两者的代码是:
#include <iostream>
using namespace std;
int main()
{
int array1[] = {10,2,5,4,10,5,6,9,8,10};
int array2[10];
int array2_elements_inserted = 0;
for(int i = 0; i < 10; i++)
{
int temp = array1[i];
bool isDuplicate = false;
for(int j = 0; j < array2_elements_inserted; j++)
{
if(temp == array2[j])
{
cout << "Duplicate " << temp << endl;
isDuplicate = true;
break;
}
}
if (!isDuplicate)
{
array2[array2_elements_inserted] = temp;
++array2_elements_inserted;
}
}
for(int k = 0; k < array2_elements_inserted; k++)
cout << array2[k] << " " << endl;
// system("pause");
}
输出:
10
2
5
4
6
9
8
答案 6 :(得分:0)
首先,使用动态容器。特别是看看那些提供的
标准库,例如std::vector
。其次,您应该使用set数据结构
跟踪您之前看到的元素,例如std::set
。
然后它只是对输入数组的迭代,并将新元素附加到 输出数组。
以下是一个例子:
#include <vector>
#include <set>
#include <iostream>
int main() {
// define and print input data
std::vector<int> v1 = {10,2,5,4,10,5,6,9,8,10};
for (int i : v1)
std::cout << i << " ";
std::cout << "\n";
// this will soon contain the output data
std::vector<int> v2;
// a set to keep track of the already seen elements
std::set<int> set;
// iterate the input array using range-based for loop
for (int i : v1) {
// check for duplicates
if (set.find(i) == set.end()) {
// first occurrence, insert to set, append to output data
set.insert(i);
v2.push_back(i);
}
else {
// seen before, do nothing
}
}
// print output data
for (int i : v2)
std::cout << i << " ";
std::cout << "\n";
}
输出:
$ g++ test.cc -std=c++11 && ./a.out
10 2 5 4 10 5 6 9 8 10
10 2 5 4 6 9 8
供参考: