如何从数组中删除重复的数字?

Posted

技术标签:

【中文标题】如何从数组中删除重复的数字?【英文标题】:How do I remove repeated numbers from an array? 【发布时间】:2019-09-04 21:42:43 【问题描述】:

我试图弄清楚如何从数组中删除整数。作业问题具有以下期望的输出:

Enter input file name: t1.txt 

Min Number: -3

Number  Count
2           3
1           1
-3          1

但我得到的是这个输出:

Enter file input name: t1.txt

Min Number: 1

Number          Count
2               3
10              1
2               3
1               1
2               3

这不是我需要的,因为重复项仍在显示。 我的问题是老师为此提供的文本文件中有 5 个整数。这一切都很好而且很花哨,但这意味着获得这个特定输出的代码需要从他打印的任何内容中删除整数。我只是很难弄清楚如何从这样的数组中删除整数。

我试图在 for 循环中实现一个 std::find 位,以便它找到重复项并将数组中的这些值替换为 0,但这没有用,它只是一直在忽略那个位的代码。我也尝试对数组进行排序,但我的问题是它的输出方式与所需输出的输出方式不同,所需输出的数字与我正在读取的 .txt 文件的顺序相同。

#include <iostream>
using namespace std;
int main()
   

    //initializer section
    int dupliCounter[30];
    int txtArray[30];

    //Section to find out how many numbers are duplicates
    for (int x = 0; x < size; x++)
    
        int temp = txtArray[x];
        for (int y = 0; y < size; y++)
        
            if (temp == txtArray[y])
            
                dupliCounter[x] += 1;
            
        
    

    //Final formatting section
    cout << "Min Number: " << min << endl;
    cout << endl;
    cout << "Number     Count" << endl;

    for (int k = 0; k < size; k++)
    
        if (dupliCounter[k] != 0)
        
            cout << txtArray[k];
            cout << "       ";
            cout << dupliCounter[k] << endl;
        
    

我在代码可以检测到重复数字的地方使用它,然后修改另一个值,该值基本上是计算它重复的次数,但我想不出一种方法让它删除多个实例同一个号码。

感谢大家的帮助!

【问题讨论】:

你不能从C++ 的数组中删除东西——它们的大小是不变的。要么使用表示缺少值的幻数(不推荐),要么使用std::vector 形式的动态内存管理。 可能重复:***.com/questions/879603/… 欢迎来到 Stack Overflow。我认为你采取了错误的方法。根本没有理由修改数组。你熟悉std::map吗? 问题中的代码不会产生问题中显示的输出。 由于缺乏声誉而无法标记为重复,但这里是 relevant response。基本上你必须覆盖内存而不是你习惯的“删除”。 【参考方案1】:

创建一个 int 的 2D 向量(因为动态大小,因为数字不同)来存储数字和计数器。第一行存储次数,第二行存储出现次数。

std::vector<std::vector<int>> counter;

for(int i=0;i<30;i++)

  for(int x=0;x<counter.size();x++)
  
    if(txtArray[i]==counter[x][0])//repeat occurrence
    
      counter[x][1]=counter[x][1]+1;
    
    else//First occurence
    
      std::vector<int> new;
      new.push_back(txtArray[i]);
      new.push_back(1);
      counter.push_back(new);
    
  
 

【讨论】:

【参考方案2】:

更正的代码。添加了在计算中跳过重复项的更改。

变化一:

for (int x = 0; x < size; x++) 
    dupliCounter[x] = 1;

更改 2(第一个循环):

if (dupliCounter[x] == 0) continue;

变化3(嵌套循环):

if (x != y) continue;

最终代码:

#include <iostream>
using namespace std;
int main()
   

    //initializer section
    int dupliCounter[30];
    int txtArray[30];
    for (int x = 0; x < size; x++) 
        dupliCounter[x] = 1;
    

    //Section to find out how many numbers are duplicates
    for (int x = 0; x < size; x++)
    
        if (dupliCounter[x] == 0) continue;
        int temp = txtArray[x];
        for (int y = 0; y < size; y++)
        
            if (x != y) continue;
            if (temp == txtArray[y])
            
                dupliCounter[x] += 1;
                dupliCounter[y] = 0;
            
        
    

    //Final formatting section
    cout << "Min Number: " << min << endl;
    cout << endl;
    cout << "Number     Count" << endl;

    for (int k = 0; k < size; k++)
    
        if (dupliCounter[k] != 0)
        
            cout << txtArray[k];
            cout << "       ";
            cout << dupliCounter[k] << endl;
        
    

【讨论】:

以上是关于如何从数组中删除重复的数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Javascript 中的数组中删除重复项?

如何以最小的复杂性识别数组中的重复数字?

如何删除数组中的最后一个逗号和空格? Java [重复]

如何从数组中的数字中找到最大和最小数字[重复]

c语言如何判断一个数组中重复元素的个数,并输出这个个数的值?

如何从数组的numpy数组中删除外部数组[重复]