劍指Offer-撲克牌順子
阿新 • • 發佈:2018-04-10
() 大小 UC interval ack java 心情 boolean 相同
題目描述
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的運氣如何。為了方便起見,你可以認為大小王是0。
思路
- 判斷數組長度是否為5
- 數組排序
- 計算0(王)的個數
- 判斷是否有相同數字(對子),有對子,則不是順子
- 判斷相鄰數字間隔是否大於王的個數,若王個數>=間隔,則用王來替代間隔的數字
代碼實現
package Other;
import java.util.Arrays;
/**
* 撲克牌順子
* 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的運氣如何。為了方便起見,你可以認為大小王是0。
*/
public class Solution47 {
public static void main(String[] args) {
Solution47 solution47 = new Solution47();
int[] numbers = {1, 2, 3, 4, 5};
System.out.println(solution47.isContinuous(numbers));
}
public boolean isContinuous(int[] numbers) {
if (numbers.length < 5)
return false;
Arrays.sort(numbers);
int cnt = 0;//統計王的數量
for (int num : numbers) {
if (num == 0) {
cnt++;
}
}
for (int i = cnt; i < numbers.length - 1; i++) {
if (numbers[i + 1] == numbers[i])
return false;
int interval = numbers[i + 1] - numbers[i] - 1;//相鄰數字間隔
//若相鄰數字間隔大於王的個數,返回false
if (interval > cnt) {
return false;
}
cnt -= interval;//用王來補間隔
}
return true;
}
}
劍指Offer-撲克牌順子