题目:
现在有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(); }