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.由於牌是五張連續的,故當輸入的參數爲空或者長度不爲 5 時,直接返回走人。
2.根據題目描述我們總共有十四種牌, 用空間換時間,創建大小爲 14 的數組,依據輸入元素值更新臨時數組下標位置處的值。
3.定義max、min,來記錄輸入參數的最小值和最大值的差距,由於大小王記爲 0 ,故參數若爲順子,則 max-min 必小於5
public boolean isContinuous(int [] numbers) {
if(numbers != null && numbers.length == 5){
int[] temp = new int[14];
int max = -1,min = 14;//有效防止參數都爲0的情況,因爲只有四張王
int len = numbers.length;
for(int i=0; i < len; i++){
temp[numbers[i]]++; //先更新臨時數組對應位置處的下標
if(numbers[i] == 0){
continue; //巧用continue
}
if(temp[numbers[i]] > 1){
return false; //倘若臨時數組對應位置的值>1,表明手中牌已經有一個對了,肯定就不會組成順子了
}
//更新參數值最大值和最小值
if(numbers[i] > max){
max = numbers[i];
}
if(numbers[i] < min){
min = numbers[i];
}
}
if((max-min) < 5){
return true;
}
}
return false;
}