一組無序的整數找出出現次數大於一半的數字

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}");
相關文章
相關標籤/搜索