妥妥的去面試之?dāng)?shù)據(jù)結(jié)構(gòu)與算法(一)

筆者由于在找工作,所以近期最主要的任務(wù)就是準(zhǔn)備面試,不打無準(zhǔn)備之仗菠劝。只有你準(zhǔn)備充分了赊舶,那么你想要的機(jī)會才有機(jī)會入你懷中睁搭。

筆者會將準(zhǔn)備面試的學(xué)習(xí)過程記錄下來,方便自己復(fù)盤的同時也希望能給一道找工作的小伙伴們一些幫助笼平。筆者準(zhǔn)備的內(nèi)容大綱如下

Android面試大綱.png

妥妥的去面試之?dāng)?shù)據(jù)結(jié)構(gòu)與算法(一)

下面是本篇博客的正菜部分:

一园骆、找出數(shù)組中重復(fù)的數(shù)字

在一個長度為n的數(shù)組里的所有數(shù)字都在0~n-1的范圍內(nèi)。找出數(shù)組中任意一個重復(fù)的數(shù)字寓调。

注意:如果題目改成找出數(shù)組中重復(fù)的數(shù)字的話锌唾,就需要和面試官溝通,我是找出所有重復(fù)的數(shù)字還是只需要找出一個就好了夺英。

排序法

先把原數(shù)組進(jìn)行一次排序晌涕,再對排序好的數(shù)組從頭到尾進(jìn)行遍歷,很容易找到重復(fù)的數(shù)字痛悯,排序長度為n的數(shù)組需要O(nlogn)的時間余黎。

哈希表法

可以借助哈希表解決該問題,從頭到尾掃描該數(shù)組载萌,判斷該掃描到的數(shù)是否存在于該哈希表中惧财,如果不存在則放于該哈希表中,如果存在則為重復(fù)元素扭仁。這個算法的時間復(fù)雜度是O(n),但卻是以大小為O(n)的空間復(fù)雜度為代價垮衷。

交換法

如果沒有重復(fù)元素的話,那么重排該數(shù)組后乖坠,數(shù)字i會出現(xiàn)在下標(biāo)i的位置搀突。如果有重復(fù)元素的話,下標(biāo)i的位置可能不止一個數(shù)字熊泵,也可能沒有數(shù)字描姚。

從頭到尾掃描數(shù)組涩赢,掃描到下標(biāo)為i的數(shù)字(用m表示)看是否等于i,如果是則接著掃描下一個數(shù)字轩勘,如果不是筒扒,再拿它和下標(biāo)為m的那個數(shù)字比較,如果相等绊寻,則找到一個重復(fù)數(shù)字花墩,如果不相等,就和它交換澄步。重復(fù)這樣的操作冰蘑,直到找到重復(fù)的數(shù)字。

代碼實例:

如果不存在重復(fù)元素的話村缸,返回-1(具體返回的值可以和面試官溝通)

public int getDuplicateNumber(int[] numbers){
        int len = numbers.length;
        if(numbers == null || len <= 0) return -1;
        for(int i=0;i<len;i++){
            if(numbers[i] < 0 || numbers[i] > len-1)
                return -1;
        }
        
        for(int i=0;i<len;i++){
            
            while(numbers[i] != i){
                if(numbers[i] == numbers[numbers[i]]){
                    return numbers[i];  //找到重復(fù)元素
                }
                else {
                    //交換numbers[i]和numbers[numbers[i]]的值
                    int temp = numbers[i];
                    numbers[i] = numbers[temp];
                    numbers[temp] = temp;
                }
            }
            
        }
        return -1;
    }

二祠肥、不能修改數(shù)組找出重復(fù)的數(shù)字

在一個長度為n+1的數(shù)組里的所有數(shù)字都在1~n的范圍內(nèi)。找出數(shù)組中任意一個重復(fù)的數(shù)字梯皿。不能改變原數(shù)組并且不可借助大小超過O(n)的輔助空間仇箱。

二分法

因為長度是n+1,所以該數(shù)組至少有一個重復(fù)的數(shù)字东羹〖燎牛可以根據(jù)長度進(jìn)行一半一半的分割。比如長度為8的數(shù)組属提,把它分兩半:1-4,5-7权逗。先在數(shù)組中找在1-4范圍內(nèi)的數(shù)的個數(shù),如果超過4個說明重復(fù)的數(shù)字在1-4中冤议。這樣就縮小了范圍斟薇,之后繼續(xù)二分,在數(shù)組中分別找1-2,3-4這兩組數(shù)字的個數(shù)恕酸,直到找到一個重復(fù)的數(shù)字堪滨。

public int getDuplicateNumber2(int[] numbers){
        int len = numbers.length;
        if(numbers == null || len <= 0) return -1;
        int start = 1;
        int end = len-1;
        
        while(end >= start){
            int middle = ((end - start) >> 1)+start;
            int count = countRange(numbers,len,start,middle);
            if(end == start){
                if(count > 1) return start;  //找到重復(fù)元素
                else break;
            }
            if(count >(middle-start+1))
                end = middle;
            else
                start = middle+1;
        
        }
        return -1;
    }
    
private int countRange(int[] numbers, int len, int start, int end) {
        if(numbers == null)
            return 0;
        int count = 0;
        for(int i=0;i<len;i++){
            if(numbers[i]>=start && numbers[i]<=end)
                ++count;
        }
        return count;
    }

參考:劍指offer P39

面試系列的文章都放于 面試妥妥的 建議小伙伴們關(guān)注該專題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市尸疆,隨后出現(xiàn)的幾起案子椿猎,更是在濱河造成了極大的恐慌,老刑警劉巖寿弱,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犯眠,死亡現(xiàn)場離奇詭異,居然都是意外死亡症革,警方通過查閱死者的電腦和手機(jī)筐咧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人量蕊,你說我怎么就攤上這事铺罢。” “怎么了残炮?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵韭赘,是天一觀的道長。 經(jīng)常有香客問我势就,道長泉瞻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任苞冯,我火速辦了婚禮袖牙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舅锄。我一直安慰自己鞭达,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布皇忿。 她就那樣靜靜地躺著畴蹭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪禁添。 梳的紋絲不亂的頭發(fā)上撮胧,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天桨踪,我揣著相機(jī)與錄音老翘,去河邊找鬼。 笑死锻离,一個胖子當(dāng)著我的面吹牛铺峭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汽纠,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卫键,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虱朵?” 一聲冷哼從身側(cè)響起莉炉,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碴犬,沒想到半個月后絮宁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡服协,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年绍昂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡窘游,死狀恐怖唠椭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忍饰,我是刑警寧澤贪嫂,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站艾蓝,受9級特大地震影響撩荣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饶深,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一餐曹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敌厘,春花似錦台猴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宪彩,卻和暖如春尿孔,著一層夾襖步出監(jiān)牢的瞬間俊柔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工活合, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留雏婶,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓白指,卻偏偏與公主長得像留晚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子告嘲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容