1. 程式人生 > >劍指offer45---撲克牌順子

劍指offer45---撲克牌順子

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;
    }
}