Java_撲克牌順子
阿新 • • 發佈:2021-11-26
題目:
現在有2副撲克牌,從撲克牌中隨機五張撲克牌,我們需要來判斷一下是不是順子。有如下規則:
A為1,J為11,Q為12,K為13,A不能視為14
如果給出的五張牌能組成順子(即這五張牌是連續的)就輸出true,否則就輸出false
資料保證每組5個數字,每組最多含有4個零,陣列的數取值為 [0, 13]
思路:
先對陣列執行排序。
判別重複: 排序陣列中的相同元素位置相鄰,因此可通過遍歷陣列,判斷 nums[i]=nums[i+1] 是否成立來判重。
獲取最大 / 最小的牌: 排序後,陣列末位元素nums[4] 為最大牌;元素 nums[joker] 為最小牌,其中 joker 為大小王的數量。
程式碼:
public static void main(String[] args) { /** * 現在有2副撲克牌,從撲克牌中隨機五張撲克牌,我們需要來判斷一下是不是順子。 * 有如下規則: * 1. A為1,J為11,Q為12,K為13,A不能視為14 * 2. 大、小王為 0,0可以看作任意牌 * 3. 如果給出的五張牌能組成順子(即這五張牌是連續的)就輸出true,否則就輸出false。 * 4.資料保證每組5個數字,每組最多含有4個零,陣列的數取值為 [0, 13]*/ // 自定義五張撲克牌 int[] arr = {5,3,7,0,12}; if(arr.length == 0){ // 初始化資料獲取隨機五張撲克牌 arr = init(); } System.out.println("是不是順子 : " + IsContinuous(arr)); } public static boolean IsContinuous(int [] numbers) { int joker = 0; Arrays.sort(numbers);// 陣列排序 // 0 3 5 7 12 for(int i = 0; i < 4; i++) { if(numbers[i] == 0) joker++; // 統計大小王數量 else if(numbers[i] == numbers[i + 1]) return false; // 若有重複,提前返回 false } return numbers[4] - numbers[joker] < 5; // 最大牌 - 最小牌 < 5 則可構成順子 }
初始化:
// 初始化資料 public static int[] init() { // 定義(2副撲克牌) List<Integer> list = new ArrayList<>(); int num = 2; // 2副撲克牌 for (int a = 0; a < num; a++) { list.add(0); list.add(0); for (int i = 0; i < 4; i++) { // 四色 for (int j = 1; j < 14; j++) { // A~K list.add(j); } } } System.out.println("list = " + list.size()); // 隨機抽取5張 List<Integer> arr = new ArrayList<>(); List<Integer> pk = new ArrayList<>(5); boolean flag = true; Random random = new Random(); for (int i = 0, len = 5; i < len; i++) { flag = true; int index = random.nextInt(list.size()); for (int j = 0; j < arr.size(); j++) { if(arr.get(j) == index){ len ++; flag = false; break; } } arr.add(index); if(flag){ pk.add(list.get(index)); }else { continue; } } System.out.println("arr = " + arr); System.out.println("pk = " + pk); return pk.stream().mapToInt(Integer::intValue).toArray(); }