1. 程式人生 > >演算法:撲克牌的順子問題

演算法:撲克牌的順子問題

最近在研究演算法的問題時,遇到了一個關於從撲克牌的順子問題 題目為:

從撲克牌中隨機抽 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; }