算法題:
1)數(shù)組與鏈表區(qū)別
數(shù)組在內(nèi)存中是連續(xù)存放的绽媒,每個元素都有相同的內(nèi)存空間,可以通過下標(biāo)迅速的找到數(shù)組中的元素免猾,但是如果修改數(shù)組元素是辕,則需要移動數(shù)組中所有元素,申請新的內(nèi)存空間猎提,比較麻煩获三。而鏈表相反,它在內(nèi)存中是不連續(xù)的锨苏,每個元素都包含有指向下一個元素的指針疙教,如果查找元素,則要從鏈表首元素開始通過指針查找伞租,但是如果要添加和刪除鏈表則比較簡單贞谓,修改指針就可以。
2)兩個長鏈表求交點(考慮環(huán))
分兩種情況葵诈,兩個無環(huán)單鏈表裸弦,則去遍歷鏈表長度,遍歷完看結(jié)尾地址是否相同作喘,相同則有交點理疙。讓長鏈表先走長度差的步數(shù),再將兩個鏈表同時走徊都,相等時得到交點。
帶環(huán)交點广辰。判斷有環(huán)暇矫,再求環(huán)的起點。判斷有環(huán)择吊,快慢指針如果相交則有環(huán)李根。此時在交點位置上,將快指針調(diào)慢几睛,慢指針回到起點房轿,再次相交則為環(huán)的起點。
3)堆排序,以及建堆的過程
堆排序是常用的一種排序算法囱持。它的思路是將一個數(shù)組先建成一個大堆夯接,去掉堆頂(堆頂為已知最大或最小)元素后纷妆,再講剩下的元素重新做堆盔几,直至全部排序。
建堆思路掩幢,輸出堆頂元素后將堆底元素放到堆頂逊拍,然后跟子節(jié)點比較替換,恢復(fù)堆的性質(zhì)际邻。
4)反轉(zhuǎn)單鏈表芯丧,反轉(zhuǎn)單鏈表的部分區(qū)間
每次將區(qū)間的表頭的后面那個元素放到區(qū)間前一個元素的后面。
5)刪除原排序數(shù)組內(nèi)重復(fù)次數(shù)超過三次的數(shù)字(不開輔助空間)
6)百萬數(shù)據(jù)尋找最大的十個數(shù)
建堆世曾。
7)連續(xù)子數(shù)組的最大和
暴力法缨恒,遍歷數(shù)組每個元素,求和對比度硝。
分治法,去中間點將數(shù)組分為三種蕊程,左數(shù)組椒袍,右數(shù)組,包含中點數(shù)組藻茂,對三種求和對比驹暑,遞歸分析。
8)快排的理解辨赐、時間復(fù)雜度优俘,什么情況下時間復(fù)雜度最高
快排實現(xiàn)就是在數(shù)組中取一個基準(zhǔn)值,將數(shù)組分為大于基準(zhǔn)值和小于基準(zhǔn)值部分實現(xiàn)基準(zhǔn)值的準(zhǔn)確定位掀序,再講剩余兩部分做遞歸分析帆焕。對有序數(shù)組快排時間復(fù)雜度最高。
9)如何判斷一個鏈表有環(huán)不恭,以及入口點在那里
見(2)
10)反轉(zhuǎn)字符串“I LOVE YOU” 為 “YOU LOVE I”
全盤反轉(zhuǎn)叶雹,然后部分反轉(zhuǎn)。
11)找第一個不重復(fù)的字符
兩個遍歷换吧,拿每個字符遍歷字符數(shù)組折晦,取得不重復(fù)的。
哈希列表沾瓦,存元素值與重復(fù)次數(shù)满着。
12)哈希的原理谦炒,以及處理沖突的方式。
HashMap的底層主要是基于數(shù)組和鏈表來實現(xiàn)的风喇,它之所以有相當(dāng)快的查詢速度主要是因為它是通過計算散列碼來決定存儲的位置宁改。HashMap中主要是通過key的hashCode來計算hash值的,只要hashCode相同响驴,計算出來的hash值就一樣透且。如果存儲的對象對多了,就有可能不同的對象所算出來的hash值是相同的豁鲤,這就出現(xiàn)了所謂的hash沖突秽誊。主要通過鏈表來解決hash沖突的。當(dāng)出現(xiàn)沖突的時候琳骡,它通過釋放原來的數(shù)組結(jié)構(gòu)锅论,并進(jìn)行分配大一個數(shù)組結(jié)構(gòu)來存放新的元素的。它的劣勢很明顯楣号,如果沖突比較多會頻繁的alloc和free最易。類似將哈希表分為基本表和溢出表兩部分,凡是和基本表發(fā)生沖突的元素炫狱,一律填入溢出表藻懒。第二種方法,當(dāng)關(guān)鍵字key的哈希地址p=H(key)出現(xiàn)沖突時视译,以p為基礎(chǔ)嬉荆,產(chǎn)生另一個哈希地址p1,如果p1仍然沖突酷含,再以p為基礎(chǔ)鄙早,產(chǎn)生另一個哈希地址p2,…椅亚,直到找出一個不沖突的哈希地址pi 限番,將相應(yīng)元素存入其中。
哈希表的構(gòu)造方法:如果事先知道關(guān)鍵字集合呀舔,并且每個關(guān)鍵字的位數(shù)比哈希表的地址碼位數(shù)多時弥虐,可以從關(guān)鍵字中選出分布較均勻的若干位,構(gòu)成哈希地址媚赖。