我正在用c ++
测试这段代码#include <iostream>
using namespace std;
int removeDuplicates(int A[], int n) {
if(n == 0) return 0;
int index = 0;
for(int i=0; i<n; i++)
{
if(A[index] == A[i])
{
continue;
}
index++;
A[index] = A[i];
}
cout<<"New array is "<<A[index]<<endl;
return index+1;
}
int main(){
int x[10] = {1,1,6};
int n = 3;
int z = removeDuplicates(x, n);
cout<<"Length is "<<z;
}
长度的结果是正确的。 但是,当cout新阵列时。结果只有6。 1缺少。
我应该在哪里放cout<<"New array is "<<A[index]<<endl;
将结果显示为New array is 16
我需要添加更多代码?请帮忙,有人吗?
答案 0 :(得分:4)
std::unique
和std::erase
是您的朋友。
std::vector
也是一位好朋友。
顺便说一下,你的程序确实正确地删除了重复项;它只是输出语句,它不会显示更多的数组而不是单个值6.
答案 1 :(得分:0)
for(int i=0; i<n; i++)
{
if(A[index] == A[i])
{
continue;
}
index++;
A[index] = A[i];
}
让我们去追踪: A = {1,1,6}; n = 3;
1ºi= 0; index = 0 - &gt; a [0] == a [0]? - &GT;继续
2ºi= 1; index = 0 - &gt; a [0] == a [1]? - &GT;继续
3ºi= 2; index = 0 - &gt; a [0] == a [2]? - &GT;不,所以索引++ - &gt; a [1] = a [2];
新阵列是:{1,6,6}。 index的值为= 1,因此您打印:
cout&lt;&lt;“New array is”&lt; 6
您返回index = 2且A = {1,6,6}。这是一个正确的结果,您的算法有效,但打印没有意义。你应该在回报中打印for:
#include <iostream>
using namespace std;
int removeDuplicates(int A[], int n)
{
if(n == 0) return 0;
int index = 0;
for(int i=0; i<n; i++)
{
if(A[index] == A[i])
{
continue;
}
index++;
A[index] = A[i];
}
return index+1;
}
int main()
{
int x[10] = {1,1,6};
int n = 3;
int size = removeDuplicates(x, n);
cout<<"Length is "<<size<<endl;
for (int i = 0; i<size; i++)
{
cout<<x[i]<<' ';
}
}
这很棒:)。但是,你有一个标准库函数:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int x[10] = {1,1,6};
int n = 3;
int* end = unique(x,x+n); // returns reference to the end
for (int i = 0;(x+i) != end; i++)
{
cout<<x[i]<<' ';
}
}
您可以在这里查看唯一的参考: http://www.cplusplus.com/reference/algorithm/unique/
答案 2 :(得分:0)
不是使用std::unique
和std::erase
,而是使用std::unique_copy
和std::ostream_iterator<>
在一行中执行此操作。让我这样做:
unique_copy(begin(ar),end(ar),ostream_iterator<T>(cout,"\n"));
其中ar
是任何STL序列容器,T
是其value_type