劍指offer45---撲克牌順子
阿新 • • 發佈:2019-01-04
LL今天心情特別好,因為他去買了一副撲克牌,發現裡面居然有2個大王,2個小王(一副牌原本是54張^_^)...他隨機從中抽出了5張牌,想測測自己的手氣,看看能不能抽到順子,如果抽到的話,他決定去買體育彩票,嘿嘿!!“紅心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是順子.....LL不高興了,他想了想,決定大\小 王可以看成任何數字,並且A看作1,J為11,Q為12,K為13。上面的5張牌就可以變成“1,2,3,4,5”(大小王分別看作2和4),“So Lucky!”。LL決定去買體育彩票啦。 現在,要求你使用這幅牌模擬上面的過程,然後告訴我們LL的運氣如何, 如果牌能組成順子就輸出true,否則就輸出false。為了方便起見,你可以認為大小王是0。
這個題關鍵是弄懂題意,給出一個數組,我們先對陣列排序,這樣,撲克就從小大排序的,接著,1,我們先計算出陣列中有幾張為大小王(就是題目的的0,0就是癩子,可以當成任何一張牌),接著,我們計算前後兩個牌的差值,去一個例子[0,0,1,3,5]
計算3和1的差值,我們需要補一張牌,補一張4,可以拿0來補,再計算5和3的差值,需要補一張4,拿0補4,最後就是求,陣列前後兩個數的差值(準確來說是需要補的牌數=差值-1)累加和,這個累加和0的個數相比較,如果0的數量多,就可以形成順子。
package JZoffertest; import java.util.Arrays; public class test45 { public boolean isContinuous(int [] numbers) { if(numbers.length==0||numbers==null) return false; Arrays.sort(numbers); int laizi=0; int temp=0; for(int i=0;i<numbers.length-1;i++) { //計算0的個數,因為0可以充當任何數,想當與癩子 //為什麼加continue,如何不加,比較[0,0,1,3,5],執行到下一步,就好把兩個0當成對子,還回false.所以當前數如果是0,直接 //執行下一個i, if(numbers[i]==0) { laizi++; continue; } //如果出現對子,直接還回false if(numbers[i+1]==numbers[i]) return false; //為什麼要見1,比如[0,,0,1,3,5].3-1=2,但是我們只需要補一張2就夠了,5-3=2,其實我們只需要補一張4就夠了, //最後比較的是,只有0(癩子)的數量大於或者等於需要補上牌的數量,就可以形成順子了。 temp+=numbers[i+1]-numbers[i]-1; } if(laizi>=temp) return true; return false; } }