題目:如何找出數組中重複次數最多的數。
方法一:以空間換時間,即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;
}