如何在C++中对数组进行排序和检查重复项

How can I sort and check an array for duplicates in C++?

本文关键字:排序 检查 C++ 数组      更新时间:2023-10-16

我试图解决的问题是在用户将值输入数组时检查数组。具体说明是:使用单独的方法进行检查;该方法必须首先对数组进行排序;重复检查必须实时执行,这意味着用户不会首先输入所有值,然后数组返回并检查它们。我环顾四周,虽然我已经弄清楚了如何排序,但我完全不知道如何在输入每个值时检查重复项。谁能把我推向正确的思维方向?

这就是我想出的,在作业范围内工作:

void getLottoPicks(int numbers[])
{
    cout << "Please enter your 7 lotto number picks between 1 and 40: " << endl;
    for (int i = 0; i < SIZE; i++)
    {
        cout << "Selection #" << i + 1 << endl;
        cin >> numbers[i];
        while (numbers[i] < 1 || numbers[i] > 40)
        {
            cout << "Please choose a number between 1 and 40: " << endl;
            cin >> numbers[i];
        }
        for (int j = 0; j < i; j++)
        {
            while (numbers[i] == numbers[j])
            {
                cout << "You have already picked that number. Enter a different one: " << endl;
                cin >> numbers[i];
            }
        }
    }
}

它的编译和运行没有任何错误(无论如何,我还没有发现任何错误)。如果有人有任何反馈,将不胜感激。我知道这种算法效率非常低,但是我们的数组只有 7 个值长,这就是所要求的。最初我认为必须对其进行排序,但只有当我们选择在不同的功能中进行检查时才需要这样做。

有很多

选项可以做到这一点。

  1. 首先,如果你只使用数组,使用 std :: sort 和 std :: unique。

  2. 如果数组中的最大数字不是很大,你可以维护一个布尔数组,你可以将其设置为 0。

       #include <cstring>
       bool a[100000];
       memset(a,0,sizeof a)
      main(){
      int x,i,arr[1000];
      while(cin>>x){
         if( a[x] == 0)
         arr[i++]=x,a[x]=1;
      }
    

在数组中输入值之前,请检查该数字的索引值是否为 0。
如果为 0,则在数组中输入值,将布尔数组的索引标记为 1。稍后您可以使用

      #include<algorithm>
      sort(arr,arr+(size of arr));

3.您可以维护一个集合来输入值,而不是数组,它将是一个二叉树,并且会丢弃任何重复值,插入后的值将按排序顺序排列。

      #include <set>
       set <int> arr;
      main(){
        int x;
        while(cin>>x)
        a.insert(x);
      }

您可以使用迭代器从集合中获取值,例如

      set<int> :: iterator it;
  1. 获取第一个输入。 把它放在数组中。
  2. 获取另一个输入。 检查它是否与数组中已有的任何其他内容不匹配。 如果是,请丢弃它。 如果没有,请按顺序将其放入数组中(以便数组保持排序)。
  3. 重复步骤 2。

或者,如果分配允许,请使用集合。


如果您不允许使用集合,请使用向量。 向量将允许您轻松地在特定索引处插入元素,以帮助保持排序。 当您向其添加元素时,它会自动调整大小。

由于您的数字是 1-40 之间的整数,因此您可以使用简单而快速的解决方案 (O(1))。您可以重复使用此技巧稍后进行排序。以下是主要内容:

  • 创建一个布尔数组,其中 40 个元素初始化为 false。我称之为vals.
  • 每次读取值时,请检查 vals[input_value] 的值。如果是 true ,则为重复项,否则设置为 true
  • 现在,为了对值进行排序,您只需执行从 1 到 40 的 for 循环,如果vals[i]为 true,则放入另一个数组或打印它。

这是我的解决方案:

void getLottoPicks(int numbers[])
{
    cout << "Please enter your 7 lotto number picks between 1 and 40: " << endl;
    int value;
    bool vals[41];
    for (int i = 0; i <= 40; i++) vals[i] = false;
    for (int i = 0; i < SIZE; i++)
    {
        cout << "Selection #" << i + 1 << endl;
        bool input_ok = false;
        while (!input_ok)
        {
            cin >> value;
            if (value < 1 || value > 40) {
                cout << "Please choose a number between 1 and 40: " << endl;
            } else if (vals[value]) {
                cout << "You have already picked that number. Enter a different one: " << endl;
            } else {
                input_ok = true;
            }
        }
        vals[value] = true;
    }
    int j = 0;
    for (int i = 1; i <= 40; i++) {
        if (vals[i]) {
            numbers[j++] = i;
        }
    }
}

此算法的灵感来自计数排序算法。计数排序算法是一种非常简单有效的算法,可以在元素为小整数时使用。