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

时间:2013-11-17 05:43:35

标签: c++ arrays sorting duplicates

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

这就是我提出的,在任务范围内工作:

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个值,这就是要求的。最初我认为它必须进行排序,但只有在我们选择在不同的功能中进行检查时才需要这样做。

3 个答案:

答案 0 :(得分:2)

您可以通过多种方式实现这一目标。

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

  2. 如果数组中的最大数字不是很大,则可以维护一个bool数组,可以将其设置为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;
      }
    
  3. 在数组中输入值之前,检查该数字的a的索引值是否为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 :(得分:1)

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

  4. 或者,如果作业允许,请使用set


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

答案 2 :(得分:0)

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

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

这是我的解决方案:

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;
        }
    }
}

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