2.3 尋找發(fā)帖水王

1 題目

Tango是微軟亞洲研究 院的一個試驗項目。研究院的員工和實習生們都很喜歡在Tango上面交流灌水把篓。傳說纫溃,Tango有一大“水王”,他不但喜歡發(fā)貼韧掩,還會回復其他ID發(fā)的每 個帖子紊浩。坊間風聞該“水王”發(fā)帖數(shù)目超過了帖子總數(shù)的一半。如果你有一個當前論壇上所有帖子(包括回帖)的列表疗锐,其中帖子作者的ID也在表中坊谁,你能快速找 出這個傳說中的Tango水王嗎?

2 分析

題目的實質是從一個數(shù)組中找到出現(xiàn)次數(shù)大于數(shù)組長度一半的元素滑臊。即[1,2,3,1,1,1]數(shù)組口芍,如何找到1

3 解法

書中列舉了幾種解法。
1)先排序雇卷,在統(tǒng)計各ID出現(xiàn)的次數(shù)鬓椭,超過總數(shù)一半的即為所求的。時間復雜度為O(nlogn+n)关划。
2)先排序小染,排序好后數(shù)組中n/2位置處的即為所需元素(前提是一定存在),比如上面的排好序后為[1,1,1,1,2,3],7/2位置處的為1贮折。時間復雜度為O(n*logn)
3)假如注意到一個事實裤翩,假定a為數(shù)組中超過一半的元素,那么數(shù)組中除去兩個不相同的元素调榄,a依然是超過現(xiàn)在數(shù)組元素一半的元素岛都。這個可以使用簡單的數(shù)學證明下律姨。

4 代碼

我們使用一個candidate表示候選元素,使用一個nTimes表示候選元素的當前出現(xiàn)次數(shù)臼疫,遍歷數(shù)組择份,會有以下幾種情況:

  1. nTimes == 0 表示可能是遍歷的第一個元素,也可能是消除了若干對不同元素后的結果烫堤,但對應的處理很簡單荣赶,就是將當前的元素作為候選元素,同時nTimes 置為1
    2)nTimes != 0 分為兩種情況:一種是候選元素和當前遍歷元素相等鸽斟,則說明遇到的是相同的元素拔创,不能刪除,需要nTimes自增1;另一種是不相同富蓄,則表示找到了兩個不同的元素剩燥,將nTimes自減1。
        int[] a = {1,1,1,2,2,2,2,3,1,1,1};
        int candidate = 0;
        int nTimes = 0;
        for(int i=0; i< a.length; i++){
            if(nTimes == 0){
                candidate = a[i];
                nTimes = 1;
            }else{
                if(candidate == a[i]){
                    nTimes++;
                }else{
                    nTimes--;
                }
            }
        }
        System.err.println(candidate);

5 擴展

隨著Tango的發(fā)展立倍,管理員發(fā)現(xiàn)灭红,“超級水王”沒有了。統(tǒng)計結果表明口注,有3個發(fā)帖很多的ID变擒,他們的發(fā)帖數(shù)目都超過了帖子總數(shù)目N的1/4。你能從發(fā)帖ID列表中快速找出他們的ID嗎寝志?
使用c1,c2,c3代表候選元素娇斑,使用t1,t2,t3表示對應的候選元素的當前出現(xiàn)次數(shù),遍歷數(shù)組材部,當前遍歷元素為k,會有以下幾種情況:

  1. k 不在c1 c2 c3 里面毫缆,而且t1 t2 t3 有為0的,那么就說明候選元素還沒有選完乐导,需要將對應t為0的c置為k,同時對應的t置為1
    2)k 不在c1 c2 c3 里面苦丁,且t1 t2 t3 均不為0,說明遇到了四個不同的元素兽叮,t1 t2 t3 均自減1
    3)k 在c1 c2 c3 里面芬骄,則對應的t自增1
    前提是數(shù)組中的元素不會為-1
public static void main(String[] args){
        int[] b = {1,2,3,4,1,2,3,4,1,2,3,4,3,2,1};
        int[] c = {-1,-1,-1};
        int[] t = {0,0,0};
        for(int i = 0; i < b.length; i++){
            int whichCandidate = getCandidate(b[i], c);
            int which = getFreeStore(t);
            if(whichCandidate == -1 && which != -1){
                c[which] = b[i];
                t[which] = 1;
            }else if(whichCandidate == -1 && which == -1){
                t[0]--;
                t[1]--;
                t[2]--;
            }else if(whichCandidate != -1){
                t[whichCandidate]++;
            }
        }
        System.err.println(c[0]+" " + c[1] +" " + c[2]);
    }
    public static int getCandidate(int c,int[] candidate){
        for(int i = 0; i < candidate.length; i++){
            if(c == candidate[i]){
                return i;
            }
        }
        return -1;
    }
    public static int getFreeStore(int[] t){
        for(int i = 0; i < t.length;i++){
            if(t[i] == 0){
                return i;
            }
        }
        return -1;
    }
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鹦聪,隨后出現(xiàn)的幾起案子账阻,更是在濱河造成了極大的恐慌,老刑警劉巖泽本,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淘太,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機蒲牧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門撇贺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冰抢,你說我怎么就攤上這事松嘶。” “怎么了挎扰?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵翠订,是天一觀的道長。 經常有香客問我遵倦,道長尽超,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任梧躺,我火速辦了婚禮似谁,結果婚禮上,老公的妹妹穿的比我還像新娘掠哥。我一直安慰自己巩踏,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布龙致。 她就那樣靜靜地躺著蛀缝,像睡著了一般顷链。 火紅的嫁衣襯著肌膚如雪目代。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天嗤练,我揣著相機與錄音榛了,去河邊找鬼。 笑死煞抬,一個胖子當著我的面吹牛霜大,可吹牛的內容都是我干的。 我是一名探鬼主播革答,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼战坤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了残拐?” 一聲冷哼從身側響起途茫,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溪食,沒想到半個月后囊卜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年栅组,在試婚紗的時候發(fā)現(xiàn)自己被綠了雀瓢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡玉掸,死狀恐怖刃麸,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情司浪,我是刑警寧澤嫌蚤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站断傲,受9級特大地震影響脱吱,放射性物質發(fā)生泄漏。R本人自食惡果不足惜认罩,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一箱蝠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垦垂,春花似錦宦搬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至页慷,卻和暖如春憔足,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酒繁。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工滓彰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人州袒。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓揭绑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親郎哭。 傳聞我的和親對象是個殘疾皇子他匪,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容