1、堅決果斷,直接上Linq面試
var list = new List<int> { 1, 2, 3, 4, 1, 3, 6, 3, 4, 3, 3, 3, 3 }; var result = list .GroupBy(m => m) .OrderByDescending(m => m.Count()) .Select(p => p.Key) .First(); Console.WriteLine($"{result}");
在面試過程,若是寫出這樣子算法,面試官確定是不滿意。算法
2、相似標記算法數組
咱們在遍歷數組的時候能夠用兩個變量,一個cand用來保存遍歷到當前數組的數字;另一個變量times是用來記錄當前數字出現的次數;在遍歷第一個數的時候將times初始化爲0,cand初始賦值爲第一個數;接下來遍歷數組blog
一、若是下一個數字與cand當前保存的數相同則times+1it
二、若是下一個數字與cand當前保存的數字不一樣則times-1class
三、當times爲0的時候,cand須要從新被賦值爲下一個數,times被從新賦值爲1,一直到遍歷結束;變量
下面舉個例子,好比有一個數組{0,1,2,1,1},按照上面的算法思想,步驟以下foreach
一、開始的時候cand先被賦值爲0,times爲1List
二、遍歷到下一個數,1與cand不一樣,則times-1爲0,;又times爲0,則cand又被從新賦值爲0,times又被從新賦值爲0遍歷
三、一樣的道理,遍歷下一個數字,2與cand不一樣,則times-1爲0;又times爲0,則cand又被從新賦值爲2,times又被從新賦值爲1
四、繼續遍歷下一個數字,1與cand不一樣,則times-1爲0;又times爲0,則cand被賦值爲1,times爲1
五、繼續遍歷,1與cand相同,times+1,times爲2;最後咱們返回的就是將times設爲2的cand
//算法2,相似標記算法 var times = 0; var temp = list[0]; foreach (var item in list) { if (times == 0) { temp = item; times = 1; } else { if (item == temp) { times++; } else { times--; temp = item; } } } Console.WriteLine($"{temp}");