題目:數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度爲9的數組{1,2,3,2,2,2,,5,4,2}.因爲數字2在數組中出現了5次,超過數組長度的一半,所以輸出2。ios
思路:從第一個數開始,出現次數設爲1,若是下一個數等於當前這個數,則加1,不等則減1,當次數值爲0時,保存下一個值,且設次數值爲1,繼續遍歷。由於這個數出現了超過一半的次數,因此咱們找出最後一個將初始值設爲1的值便可。數組
#include<iostream> using namespace std; //檢查數組是否有效 bool arrayInvalid = false; bool CheckInvalidArray(int* numbers, int length) { arrayInvalid = false; if (numbers == NULL || length < 0) { arrayInvalid = true; } return arrayInvalid; } //判斷該數組出現頻率最大的那個數有沒有超過一半 bool CheckMoreThanHalf(int* numbers, int length, int number) { int times = 0; for (int i = 0; i < length; ++i) { if (numbers[i] == number) { times++; } } bool isMoreThanHalf = true; if (times * 2 <= length) { arrayInvalid = true; isMoreThanHalf = false; } return isMoreThanHalf; } //找出這個數 int MoreThanHalfNum(int* numbers, int length) { if (CheckInvalidArray(numbers, length)) { return 0; } int result = numbers[0]; int times = 1; for (int i = 1; i < length; i++) { if (times == 0) { result = numbers[i]; times = 1; } else if (numbers[i] == result) { times++; } else { times--; } } if (!CheckMoreThanHalf(numbers, length, result)) { result = 0; } return result; } int main() { int a[7] = {1,2,2,4,2,2,3}; int b = MoreThanHalfNum((int*)a, 7); cout << b << endl; }