數組中重複次數最多的數

題目:如何找出數組中重複次數最多的數。
方法一:以空間換時間,即hash法。可以定義一個數組 int count[MAX + 1],並將其數組元素都初始化爲0;然後對原數組array[ ]進行遍歷,並執行 count[ array[ i ] ]++ 操作;最後在count數組中找到最大的數,該數在count數組中對應的下標,即爲array數組中重複次數最多的數。

具體實現如下:

#include <iostream>

int MaxRepeat(int arr[],int len)
{
    int max = arr[0];
    for (int i = 0; i < len; i++) // 找出原數組中的最大值
    {
        if(max <= arr[i])
            max = arr[i];
    }

    int *count = new int[max + 1]; 

    for (int i = 0; i < (max + 1); i++) // 將新數組的元素全部初始化爲0
        count[i] = 0; // 也可使用 *(count + i) = 0;

    for (int i = 0; i < len; i++) // 記錄每個數出現的次數
        count[arr[i]]++; // 也可使用 (*(count+arr[i]))++;

    int MAX = count[0]; // count數組中的最大值
    int j = 0; // count數組中最大值對應的下標(該下標就是原arr數組中出現次數最多的數)
    for (int i = 0; i < (max + 1); i++)
    {
        if (count[i] > MAX)
        {
            MAX = count[i];
            j = i;
        }
    }
    delete [] count;

    return j;
}

int main(int argc, const char * argv[]) {

    int arr[] = {1,2,2,2,2,2,3,4,5,6,7};
    int len = sizeof(arr)/sizeof(int);

    printf("出現次數最多的數爲 %d\n", MaxRepeat(arr, len));

    return 0;
}

備註:一般情況下,除非內存空間足夠大,否則一般不採用這種方法。

方法二:使用map映射表,通過引入map表(map是STL的一個關聯容器,它提供一對一的數據處理能力,其中第一個爲關鍵字,每個關鍵字只能在map中出現一次,第二個稱爲該關鍵字的值)來記錄每一個元素出現的次數,然後判斷次數大小,進而找出重複次數最多的元素。

具體實現如下:

#include <iostream>
#include <map>
using namespace std;

// 第二種方法(藉助map)
int MaxRepeat2(int arr[], int len)
{
    map<int,int> m;

    int val = arr[0]; // 假設val爲原數組中出現最多次數的數,並初始化爲arr[0];
    for (int i = 0; i < len; i++)
    {
        m[arr[i]]++;
        if (m[arr[i]] > m[val])
            val = arr[i];
    }

    return val;
}

int main(int argc, const char * argv[]) {

    int arr[] = {1,2,2,2,2,2,3,4,5,6,7};
    int len = sizeof(arr)/sizeof(int);

    printf("出現次數最多的數爲 %d\n", MaxRepeat2(arr, len));

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章