c ++删除已排序数组中的重复项 - 打印新数组

时间:2015-02-27 22:12:26

标签: c++ algorithm

我正在用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

我需要添加更多代码?请帮忙,有人吗?

3 个答案:

答案 0 :(得分:4)

std::uniquestd::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::uniquestd::erase,而是使用std::unique_copystd::ostream_iterator<>在一行中执行此操作。让我这样做:

unique_copy(begin(ar),end(ar),ostream_iterator<T>(cout,"\n"));

其中ar是任何STL序列容器,T是其value_type