输出没有重复元素的动态数组(缩小数组)C++

Posted

技术标签:

【中文标题】输出没有重复元素的动态数组(缩小数组)C++【英文标题】:Output dynamic array without duplicate elements (shrink the array) C++ 【发布时间】:2018-11-01 19:05:20 【问题描述】:

我需要使用循环和基本代码生成动态数组并删除重复元素(缩小数组)(1,2,2,3 ==== 1,2,3)。我创建了一个数组,但不知道如何删除元素。也许,通过将唯一元素复制到新数组。

void RandArrayA(int * A, const int m)

    srand(time(0));

    for (int a = 0; a < m; a++)
    
        A[a] = rand() % 10 * (1 - 2 * (rand() % 2));
        cout << A[a] << " ";
    

    cout << endl;


void Find(int * A, const int m)



【问题讨论】:

提示:你不能从数组中删除元素,你只能覆盖它们 我需要缩小数组 必须保留订单吗?我的意思是,如果给你1 3 2 3 4 5,你必须返回什么? 1 3 2 4 5 删除第二个重复项 结果是否需要与输入保持相同的顺序?不连续的重复元素会被删除吗?哪些? 【参考方案1】:

您不能删除元素。数组的大小是固定的。

但是,您可以通过将它们移开并假装它们不再存在来伪造它。

当您检测到“重复”时,将其移动到数组的末尾。 (您可能需要对所有后续元素进行洗牌以腾出空间,或者如果您不太关心顺序,可以使用一些花哨的交换恶作剧)。

然后,如果您在总共 n 个值中检测到总共 x 个重复项,那么您只需要打印第一个 n-x 数组的值。这会“隐藏”重复项。

它们仍然存在,位于数组的末尾,但您无需对它们进行任何操作。

让我们看看你的数据集:

Original:    1,3,5,4,5   (5 elements)
Reorganised: 1,3,5,4,5   (1 duplicate; therefore, 4 useful elements)

不幸的是,这不是一个很好的演示示例,因为唯一的重复值是 already 在数据集的末尾!

选择一个随机的替代数据集:

Original:    1,1,3,4,5,6,5,8   (8 elements)
Reorganised: 1,3,4,5,6,8,1,5   (2 duplicates; therefore, 6 useful elements)

顺便说一句,这种“移动到最后”是std::remove 和朋友们的工作方式,以及为什么您需要执行std::erase 来最终消除包含“隐藏”值的容器元素。

【讨论】:

非常感谢您的回答。我忘了写我们可以创建第二个数组并从第一个数组中复制独特的元素,但我不知道该怎么做。 @Alina:在我的第二个示例中,您可以创建一个大小为 6 的数组并将 6 个有用的元素复制到其中吗?老实说,尽管这样做毫无意义。 好的。谢谢你。 :-) 我是 C++ 新手 @Alina 祝你好运!

以上是关于输出没有重复元素的动态数组(缩小数组)C++的主要内容,如果未能解决你的问题,请参考以下文章

c++两个数组合并成一个新数组

c++ 动态数组初始值不为0?

c++ 动态数组初始值不为0?

创建结构元素的动态数组,然后创建结构的动态数组。 C++

如何在C++中创建一维动态数组

数组筛选数组arr中重复的元素,考虑时间复杂度