[2021校招必看之Java版《剑指offer》-45] 扑克牌顺子

一、题目描述

  【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张,而后判断是否是顺子?
  对于本题,只要总结出解得通用特色便可。数组