[LeetCode]剑指 Offer 61. 扑克牌中的顺子
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode]剑指 Offer 61. 扑克牌中的顺子相关的知识,希望对你有一定的参考价值。
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
示例 1:
输入: [1,2,3,4,5]
输出: True
示例 2:
输入: [0,0,1,2,5]
输出: True
题解一:
/**
* 剑指 Offer 61. 扑克牌中的顺子
*/
public boolean isStraight(int[] nums)
/*
* 5 张牌要组成顺子,则最多只能出现重复的两个 0,其余数字不可能重复,重复时直接返回 false
* 由于 0 可以当作任意点数的牌,所以分情况讨论以理清思路:
* 1. 零个 0:组成顺子时最大点数 - 最小点数 === 4
* 2. 一个 0:如 0,5,7,8,9,由于 0 可以当作 6,则最大点数(9) - 最小点数(5) = 4
* 3. 两个 0:如 0,0,6,7,8,由于 0 可以当作 4,5 或 9,10,此时最大点数(8) - 最小点数(6) = 2
* 总结:当牌的最大点数 - 最小点数 <= 4 时即可组成顺子
*/
Set<Integer> set = new HashSet<>();
int max = 0;
int min = 14;
for (int num : nums)
// 如果是 0 则继续遍历,寻找最大点数和最小点数
if (0 == num)
continue;
// 判断当前元素是否重复,重复则直接返回 false
if (!set.add(num))
return false;
max = Math.max(max, num);
min = Math.min(min, num);
return max - min <= 4;
题解二:
/**
* 剑指 Offer 61. 扑克牌中的顺子
*/
public boolean isStraight(int[] nums)
/*
* 先对数组进行排序,遍历数组的过程中统计大小王的个数,
* 并判断除 0 外是否存在重复的点数,存在则直接返回 false
* 注:数组排序完成之后,最大点数一定是 nums[4],最小点数一定是 nums[大小王数量]
* 1. 不存在大小王的情况下最小点数一定是 nums[0],如 1,2,3,4,5
* 2. 存在一个大小王情况下最小点数一定是 nums[1],如 0,1,2,4,5(因为 0 可以充当任何点数,那么一定充当比当前数组中最小点数还要大的数)
* 3. 存在两个大小王情况下最小点数一定是 nums[2],如 0,0,2,4,5(因为 0 可以充当任何点数,那么一定充当比当前数组中最小点数还要大的数)
*/
Arrays.sort(nums);
int joker = 0;
for (int i = 0; i < 4; i++)
// 统计大小王的数量
if (nums[i] == 0)
joker++;
// 存在重复点数
else if (nums[i + 1] == nums[i])
return false;
// 最大点数与最小点数之差小于等于 4 则是顺子
return nums[4] - nums[joker] <= 4;
限制:
- 数组长度为 5
- 数组的数取值为 [0, 13] .
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof
以上是关于[LeetCode]剑指 Offer 61. 扑克牌中的顺子的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode]剑指 Offer 61. 扑克牌中的顺子
#yyds干货盘点#剑指 Offer 61. 扑克牌中的顺子
剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数