演算法:撲克牌的順子問題
阿新 • • 發佈:2019-01-25
最近在研究演算法的問題時,遇到了一個關於從撲克牌的順子問題 題目為:
從撲克牌中隨機抽 5 張牌,判斷是不是順子,即這 5 張牌是不是連續的。 2-10 為數字本身,A 為 1,J 為 11,Q 為 12,K 為 13,而大小王可以看成任意的 數字。
思路:
- 1、首先我們應該關注的是大小王等特殊字元,由於可以當成任意的數字,所有當成0處理。
- 2、把陣列排序,再統計陣列中0的個數
- 3、統計排序之後的陣列中相鄰數字之間的空缺總數。
- 4、陣列中的非0數字重複出現,則該陣列是不連續的。
- 5、如果空缺的總數小於或者等於0的個數,那麼這個陣列就是連續的,反之則不連續
詳細程式碼:
private boolean isOrderly(int[] number) {
//1、非空判斷
if (number == null){
return false;
}
//2、計算 0 的個數
int zero = 0;
for (int num : number) {
if (num == 0) {
zero++;
}
}
//3、將陣列排序
Arrays.sort(number);
//4、排序完成之後 從非零資料進行兩兩判斷
int small = zero;
int big = small + 1;
int numberGap = 0;
//5、排除一種情況 相鄰資料不相等情況
//進行迴圈的基礎條件
while (big < number.length) {
if (number[small] == number[big]) {
return false;//有對子的存在
}
//統計相鄰之間的空格
numberGap += number[big] - number[small] - 1 ;
//所有的資料進行後移一位
small = big;
big++;
}
//判斷所有的間隔與0的個數 小於或者等於則是有序的 否則則是無序的
return numberGap <= zero;
}