在Array中查找出现次数

时间:2015-01-31 20:52:04

标签: c++ c++11

我必须找到数组中每个元素的出现位置。 到目前为止我的代码是这个

void Occurrences()
{
    int numers[10], count = 0, i;
    for (i = 0; i < 10; i++)
    {
        cout << "Enter Number";
        cin >> numers[i];
    }
    for (i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (numers[i] == numers[j])
            {
                count++;
            }
        }
        cout << numers[i] << " is Occur " << count << " Time in Array" << endl;
        count = 0;
    }
}
int main()
{
    Occurrences();
}

输出正在加倍相同的数字,即如果我输入了6个1和4 2个。输出

  

1在阵列中出现6次   1在阵列中出现6次   1在阵列中出现6次   1在阵列中出现6次   1在阵列中出现6次   1在阵列中出现6次   2在阵列中发生4次   2在阵列中发生4次   2在阵列中发生4次   2在阵列中发生4次。

但我想要这样的输出:

  

1在阵列中出现6次   2在阵列中发生4次。

我该怎么做?

4 个答案:

答案 0 :(得分:2)

由于您标记了此C ++ 11,我将使用std::unordered_map

void Occurrences()
{
    std::unordered_map<int, int> occurrences;

    // enter 10 numbers
    for (int i = 0; i < 10; ++i) {
        cout << "Enter Number";
        int x;
        cin >> x;
        ++occurrences[x]; // increment the count for x
    }

    // print results
    for (const auto& pr : occurrences) {
        std::cout << pr.first << " appears " << pr.second << " times." << std::endl;
    }
}

答案 1 :(得分:2)

您的问题是您正在搜索已输出的项目。如果先对数组进行排序,则可以跳过这些项目。

为了与众不同,我将告诉你如何使用现有代码,数组而不是地图来实现这一目标。

  • 读取数组中的值。
  • 对数组进行排序。
  • 枚举数组,并忽略(但计数)与前一个元素匹配的任何元素。发现新元素时重置计数器。
  • 就是这样。

示例:

#include <iostream>
#include <algorithm>

void Occurrences()
{
    int numers[10], i;
    for (i = 0; i < 10; ++i)
    {
        std::cout << "Enter Number";
        if (!(std::cin >> numers[i]))
            break;
    }

    // sort the array in ascending order , O(NlogN)
    std::sort(numers, numers+i);

    for (const int* it = numers; it != numers+i;)
    {
        unsigned int count = 1;
        int value = *it;
        for (++it; (it != numers+i) && *it == value; ++count, ++it);
        std::cout << value << " occurs " << count << " times." << std::endl;
    }
}

int main()
{
    Occurrences();
}

您的样品运行

Enter Number1
Enter Number1
Enter Number1
Enter Number1
Enter Number1
Enter Number1
Enter Number2
Enter Number2
Enter Number2
Enter Number2
1 occurs 6 times.
2 occurs 4 times.

无需地图。如果您选择使用地图,请考虑无序地图(哈希表),因为它可能会产生更好的性能。

祝你好运。

答案 2 :(得分:-1)

最好将其存储在map中并稍后显示所有内容。

    void Occurrences()
    {
        int numers[10],count = 0,i;
        std::map<int,int> mapCnt;
        for(i =0;i<10;i++)
        {
            cout<<"Enter Number";
            cin>>numers[i];
        }
        for( i = 0;i<10;i++)
        {
           for(int j = 0;j<10;j++)
           {
               if(numers[i] == numers[j])
               {
                   count++;
               }
           }

           mapCnt[numers[i]]=count;
               count = 0;

        }

    // Print the map Here
  typedef std::map<int,int>::iterator it_type;
  for(it_type iterator = mapCnt.begin(); iterator != mapCnt.end(); iterator++) {

     cout << iterator->first << " is Occur " << iterator->second << " Time in Array" << endl;

    }

}

循环播放地图https://stackoverflow.com/a/4844904/2466168

答案 3 :(得分:-1)

maandoo代码的变体,如果您可以按以下方式处理数字:

void Occurrences()
{
    int i;
    std::map<int,int> mapCnt;
    for(i =0;i<10;i++)
    {
        int num;
        cout<<"Enter Number";
        cin>>num;
        std::map< int, int >::iterator iter( mapCnt.find( num ) );
        if( iter != mapCnt.end() )
            mapCnt[num] = 1;
        else
            ++( iter->second );
    }

    // Print the map Here
    for( i = 0; i < mapCnt.size(); ++i )
        std::cout << mapCnt[i].first << " occurs " << mapCnt[i].second << " times in array\n";
}