【LeetCode & 剑指offer刷题】数组题14:61 扑克牌中的顺子
【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)
61 扑克牌中的顺子
从扑克牌中随机抽 5 张牌,判断是不是顺子,即这 5 张牌是不是连续的。 2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而
大小王可以看成任意的 数字。(大小王最多4张)
思路:
1、首先我们应该关注的是
大小王等特殊字符,由于
可以当成任意的数字,所有当成0处理。
2、把
数组排序,再统计数组中0的个数
3、统计排序之后的数组中
相邻数字之间的空缺总数。
4、
数组中的非0数字重复出现,则该数组是不连续的。
5、如果
空缺的总数小于或者等于0的个数,那么
这个数组就是连续的,反之则不连续
/*
1、排序
2、计算所有相邻数字间隔总数
3、计算0的个数
4、如果2、3相等,就是顺子
5、如果出现对子,则不是顺子
*/
class
Solution
{
public
:
bool
IsContinuous
(
vector
<
int
>
numbers
)
{
if
(
numbers
.
empty
())
return
false
;
int
num_of_zero
=
0
;
int
num_of_interval
=
0
;
sort
(
numbers
.
begin
(),
numbers
.
end
());
//排序
for
(
int
i
=
0
;
i
<
numbers
.
size
()-
1
;
i
++)
//注意这里是0~n-2的范围,因为后面需要计算a[i+1]
{
//统计癞子数量
if
(
numbers
[
i
]
==
0
)
{
num_of_zero
++;
continue
;
//继续循环
}
//如果存在对子,直接返回
if
(
numbers
[
i
]
==
numbers
[
i
+
1
])
return
false
;
//统计间隔数量
num_of_interval
+=
numbers
[
i
+
1
]
-
numbers
[
i
]
-
1
;
}
if
(
num_of_zero
>=
num_of_interval
)
return
true
;
else
return
false
;
}
};
//10、J、Q、K、A(10 11 12 13 1)本题返回false,严格来说应该做判断