题目:
从一副扑克牌(54张)中随机抽5张牌,判断这5张牌是否构成一个顺子,即是否连续。在扑克牌中,2~10为数字本身,A为1,J为11,Q为12,K为13,大小王可以看成任意数字。
思路
1、将大小王看做0,0
2、除了大小王外,其它任何数字,只要出现2次,就不是顺子
3、5个数中,除了大小王外,其它的数(可能5个、4个、3个),排序后,大的减小的,累和 <= 4,则为顺子
- 无0:[1,2,3,4,5]:大减小累和4
- 1个0: [1,2,3,5]:大减小累和4
- 2个0:[1,3,5]: 大减小累和4
public class Main {
private boolean isStraightNew(int[] array) {
// 除了0外,其它任何数字出现次数 >= 2,则不为顺子
Map<Integer, Integer> map = new HashMap<>();
for (int item : array) {
map.merge(item, 1, Integer::sum);
}
boolean inValid = map.entrySet().stream().anyMatch(entry -> entry.getValue() >= 2 && entry.getKey() != 0);
if (inValid) {
return false;
}
Arrays.sort(array);
// 无论是没有0,还是1个0,还是2个0。只要除去0的剩余数字,后减前 累和 <= 4,则为顺子
Integer[] noZerArr = Arrays.stream(Arrays.stream(array).boxed().toArray(Integer[]::new))
.filter(i -> i != 0).toArray(Integer[]::new);
int sum = 0;
for (int i = 0; i < noZerArr.length - 1; i++) {
sum += noZerArr[i + 1] - noZerArr[i];
}
return sum <= 4;
}