19.數(shù)組中只出現(xiàn)一次的數(shù)字
題目描述:一個(gè)整型數(shù)組里除了兩個(gè)數(shù)字之外,其他的數(shù)字都出現(xiàn)了偶數(shù)次。請(qǐng)寫程序找出這兩個(gè)只出現(xiàn)一次的數(shù)字。
思路:
暴力解法:將數(shù)組排序,如果這個(gè)數(shù)和它前后兩個(gè)數(shù)都不等,就是要找的數(shù),注意第一個(gè)和最后一個(gè)
暴力解法:用ArrayList存遍歷數(shù)組的值,若當(dāng)前遍歷的值,在ArrayList中都有了,在ArrayList中刪除該值,最后ArrayList中的兩個(gè)數(shù)就是只出現(xiàn)一次的數(shù)字
20.統(tǒng)計(jì)一個(gè)數(shù)字在排序數(shù)組中出現(xiàn)的次數(shù)
題目描述:統(tǒng)計(jì)一個(gè)數(shù)字在排序數(shù)組中出現(xiàn)的次數(shù)
暴力解法:從頭遍歷數(shù)組,比較數(shù)字出現(xiàn)的次數(shù)
因?yàn)閿?shù)組有序,從找到第一個(gè)數(shù)字開始,直到這個(gè)數(shù)字結(jié)束的比較次數(shù)才是有意思的,所以先用二分查找法找到數(shù)字第一次出現(xiàn)位置和最后一次出現(xiàn)的位置,最后做差
感悟:總想暴力解決算法
21.兩個(gè)鏈表的第一個(gè)公共結(jié)點(diǎn)
題目描述:輸入兩個(gè)鏈表,找出它們的第一個(gè)公共結(jié)點(diǎn)
思路:比較兩個(gè)鏈表的長(zhǎng)度,讓長(zhǎng)鏈表移動(dòng)到兩鏈表長(zhǎng)度差個(gè)元素的位置,然后在一起移動(dòng)指針,相遇的第一個(gè)節(jié)點(diǎn)就是返回結(jié)果
感悟:思路清晰,實(shí)現(xiàn)不難,就是要細(xì)心,之前把計(jì)算第二個(gè)鏈表長(zhǎng)度的語句寫成
while(temp2!=null){
? ? ? ? ? ? len2++;
? ? ? ? ? ? temp2=temp1.next;
? ? ? ? }
測(cè)試不通過,找了好久。。。
22.和為S的連續(xù)正數(shù)序列
題目描述:小明很喜歡數(shù)學(xué),有一天他在做數(shù)學(xué)作業(yè)時(shí),要求計(jì)算出9~16的和,他馬上就寫出了正確答案是100。但是他并不滿足于此,他在想究竟有多少種連續(xù)的正數(shù)序列的和為100(至少包括兩個(gè)數(shù))。沒多久,他就得到另一組連續(xù)正數(shù)和為100的序列:18,19,20,21,22?,F(xiàn)在把問題交給你,你能不能也很快的找出所有和為S的連續(xù)正數(shù)序列? Good Luck!
思路:設(shè)置兩個(gè)指針,一個(gè)指向當(dāng)前序列的最小的數(shù),一個(gè)指向當(dāng)前序列最大的數(shù)。
1)設(shè)置兩個(gè)指針,一個(gè)為small指向當(dāng)前正數(shù)序列中最小的數(shù),一個(gè)為big指向當(dāng)前正數(shù)序列中最大的數(shù);因?yàn)橹辽侔▋蓚€(gè)數(shù),所以small一定比和S的一半要小,查找的邊界就是small<(1+s)/2
2)若是當(dāng)前的正數(shù)序列之和大于S,縮小序列范圍,和中減掉small,讓small指針不停向后走,直到等于S停止;
3)若是當(dāng)前的正數(shù)序列之和小于S,擴(kuò)大序列范圍,和中加上big,讓big指針不停向后走,直到和為S停止;
23.數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字
題目描述:數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長(zhǎng)度的一半,請(qǐng)找出這個(gè)數(shù)字。例如輸入一個(gè)長(zhǎng)度為9的數(shù)組{1,2,3,2,2,2,5,4,2}。由于數(shù)字2在數(shù)組中出現(xiàn)了5次,超過數(shù)組長(zhǎng)度的一半,因此輸出2。如果不存在則輸出0。
思路:
暴力解決:將數(shù)組排序,位于中間位置的數(shù)字就是超過數(shù)組長(zhǎng)度一半的那個(gè)數(shù)。
思路二(有問題):要找的數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長(zhǎng)度的一半,也就是說它出現(xiàn)的次數(shù)比其他所有數(shù)字出現(xiàn)的次數(shù)的和還要多。當(dāng)遍歷到下一個(gè)數(shù)字的時(shí)候,如果下一個(gè)數(shù)字和當(dāng)前保存的數(shù)字相同,則次數(shù)加 1;如果和當(dāng)前保存的數(shù)字不同,則次數(shù)減 1;當(dāng)次數(shù)減到 0 的時(shí)候,將保存的數(shù)字改為當(dāng)前遍歷所處的位置,并將次數(shù)更改為 1。
思路三:HashMapmap<Integer,Integer>map = new HashMap<Integer,Integer>()用map,一個(gè)存數(shù)字,一個(gè)存次數(shù)