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

文章目录

  • 1、题目描述
  • 2、解题思路
  • 3、解题代码
  • 4、解题心得

1、题目描述

  【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,排序
  难度:☆

2、解题思路

  首先,对于这道题的描述,不是我语文差就是出题人语文差。鉴于本人水平目前是不高,还是自己语文差吧。
  描述重构:有一个包含五个数字的数组,每个数字的取值范围是0-13,问这个数组能不能组成一个顺子,其中0可以代表1-13的任何数(比如:[2,0,4,0,6]是一个顺子,两个0分别表示3和5)。
  顺子的组成可以很多种,首先找出这些顺子的特征:
  1、除了0之外,不能有重复的数字;
  2、最大值和最小值的差小于5;
  满足这两个条件的数组,就是顺子了。

3、解题代码

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;
    }
}

4、解题心得

  本题难度很低,最难的一步我觉得就是读题了,很多题目要仔细琢磨很多遍才知道它到底在说什么。本题其实本质上和扑克牌没什么联系,很多人会误以为:是不是从54张扑克牌抽5张,然后判断是不是顺子?
  对于本题,只要总结出解得通用特点即可。

你可能感兴趣的:(剑指offer(Java语言))