【JZ45】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的运气如何, 若是牌能组成顺子就输出true,不然就输出false。为了方便起见,你能够认为大小王是0。
知识点:数组,set,排序
难度:☆java
首先,对于这道题的描述,不是我语文差就是出题人语文差。鉴于本人水平目前是不高,仍是本身语文差吧。
描述重构:有一个包含五个数字的数组,每一个数字的取值范围是0-13,问这个数组能不能组成一个顺子,其中0能够表明1-13的任何数(好比:[2,0,4,0,6]是一个顺子,两个0分别表示3和5)。
顺子的组成能够不少种,首先找出这些顺子的特征:
一、除了0以外,不能有重复的数字;
二、最大值和最小值的差小于5;
知足这两个条件的数组,就是顺子了。web
package pers.klb.jzoffer.medium; import java.util.HashSet; /** * @program: JzOffer2021 * @description: 扑克牌顺子 * @author: Meumax * @create: 2020-06-26 17:20 **/ public class PlayingCardSequence { public boolean isContinuous(int[] numbers) { // 不是5个数字,确定不是顺子 if (numbers.length != 5) { return false; } // 定义两个变量用于存储五个数字中的最大值和最小值 // 初始化数字非0数字不可能的取值 int max = 0; int min = 14; HashSet<Integer> set = new HashSet<>(); for (int number : numbers) { // 除了0之外,判断是否存在相同数字 if (number > 0) { if (set.contains(number)) { return false; } else { set.add(number); max = Math.max(max, number); min = Math.min(min, number); } } } // 若是最大值和最小值的差不是小于5,确定不是顺子 // 反之,即没有重复,差值又小于5,无论有没有0,都确定是顺子 return max - min < 5; } }
本题难度很低,最难的一步我以为就是读题了,不少题目要仔细琢磨不少遍才知道它到底在说什么。本题其实本质上和扑克牌没什么联系,不少人会误觉得:是否是从54张扑克牌抽5张,而后判断是否是顺子?
对于本题,只要总结出解得通用特色便可。数组