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

c++ Remove the duplicates in sorted array - print the new array

本文关键字:数组 打印 新数组 排序 删除 c++      更新时间:2023-10-16

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

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

std::uniquestd::erase是您的朋友。

std::vector也是一个好朋友。

顺便说一句,你的程序确实正确地删除了重复项;只是输出语句没有显示比单个值6更多的数组。

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->a[0]==a[0]?->继续

2ºi=1;index=0->a[0]==a[1]?->继续

3ºi=2;index=0->a[0]==a[2]?->没有,所以索引++->a[1]=a[2];

新数组为:{1,6,6}。索引的值为=1,所以您打印:

cout<lt;"新数组是"<6

您将返回index=2和A={1,6,6}。这是一个正确的结果,你的算法有效,但打印没有意义。您应该在返回中使用打印:

#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]<<' ';
    }
}

您可以在此处查看unique的引用:http://www.cplusplus.com/reference/algorithm/unique/

不要使用std::uniquestd::erase,而是在一行中使用std::unique_copystd::ostream_iterator<>。让我这样做:

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

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