一、春節期間小明使用微信收到不少個紅包,很是開心。在查看領取紅包記錄時發現,某個紅包金額出現的次數超過了紅包總數的一半。請幫小明找到該紅包金額。寫出具體算法思路和代碼實現,要求算法儘量高效。給定一個紅包的金額數組gifts及它的大小n,請返回所求紅包的金額。
算法
測試樣例:數組
[1,2,3,2,2] 5微信
返回:2ide
解題思路:測試
採用陣地攻守的思想: 第一個數字做爲第一個士兵,守陣地;count = 1; 遇到相同元素,count++; 遇到不相同元素,即爲敵人,玉石俱焚,count--;當遇到count爲0的狀況,又以新的i值做爲守陣地的士兵,繼續下去,到最後還留在陣地上的士兵,有多是主元素,也有多是最後一個元素。再加一次循環,記錄這個士兵的個數看是否大於數組通常便可。it
int MoreThanHalfNum_Solution(int* gifts, int size) { if (gifts == NULL) { return 0;; }//參數錯誤 int count = 1;//計數器記錄士兵的生命值 int soldier = gifts[0];//士兵初始化爲第一個數字 for (int i = 1; i < size; i++) { if (soldier == gifts[i])//遇到相同的元素士兵生命值增長 { count++; } else//遇到不相同的元素士兵生命值減小 { count--; } if (count == 0)//士兵的生命值爲0時將下一個元素從新賦給士兵 { soldier = gifts[++i]; count = 1;//士兵生命值爲1 } } count = 0; for (int j = 0; j < size; j++) { if (soldier == gifts[j]) { count++;//計數器記錄該士兵出現的次數 } } if (count > size / 2) { return soldier;//士兵出現的次數大於一半 } return 0;//沒有出現一半 }
二、有36輛自動×××和6條跑道,沒有計時器的前提下,最少用幾回比賽能夠篩選出最快的三輛×××?io
解題思路:class
1)首先將36輛車分爲6組進行一次比賽,這是必不可少的,假設六組的代碼分別爲A,B,C,D,E,F。經過6次比賽能夠分別的找到每組的第一名A1,B1,C1,D1,E1,F1。循環
2)接下來就能夠再進行第7場比賽,讓各小組的第一名A1,B1,C1,D1,E1,F1進行比賽,淘汰掉後三名假設爲D1,E1,F1,進而能夠將D,E,F三組整個淘汰。而且獲得6組的第一名,假設爲A1,同時也爲36輛車的第一名。di
3)進行最後一場比賽,由於第一名已經決出爲A1,同時只剩下B1,C1,A2,B2,C2,A3,B3,C3,從其中找到第2名和第3名,經過分析能夠獲得,若是在已知的比賽結果中若是存在2輛車跑的比他快,則能夠直接淘汰,由於就算成績最好的結果下他也爲第4名。
因爲:
B1>B2>B3
C1>C2>C3
B1>C1>C2
因此B3,C3,C2能夠直接淘汰,最後剩下的待肯定的×××爲B1,C1,B2,A2,A3
綜上所述,最少8次比賽則能夠篩選出最快的三輛×××。