首先我想到的是建一個hash表,存放每個數字對應的次數;但是題目沒有給定數組的大小,這樣做可能無限大;
然后先到可以對數組排序,這樣遍歷一次就可以了;但時間復雜度為O(nlog(n))
這里我們的思路是,遍歷數組,記錄一個數字和次數times;遇到相同的數字則次數加一,遇到不同的數字則減一;如果次數變為0,則數字更新為當前的數字,并把次數置1;如此遍歷之后,因為我們要尋找的數字次數超過總數字一半,最后有一個數字的次數不為0,得到的就是我們要找到的數字。可以自己舉例子體會一下。
這一段代碼如下:
int ret = arr[0];
int n = 1;
for (int i =1 ; i < len; i++)
{
if (n == 0)
{
ret = arr[i];
n = 1;
}
else if (arr[i] == ret)
n++;
else
n--;
}
為了增加程度對錯誤輸入的處理能力,加入了幾行判斷的語句:
bool inputInvalid = false;
int findNUmber(int* arr,int len)
{
int ret = arr[0];
int n = 1;
if (!arr || len == 0)
{
inputInvalid = true;
return 0;
}
for (int i =1 ; i < len; i++)
{
if (n == 0)
{
ret = arr[i];
n = 1;
}
else if (arr[i] == ret)
n++;
else
n--;
}
//check if input valid
n = 0;
for (int i = 0; i < len; i++)
{
if (arr[i] == ret)
n++;
}
if (n * 2 < len)
inputInvalid = true;
if (!inputInvalid)
return ret;
else
return 0;
}