剑指offer61. 扑克牌中的顺子 P298
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字。
方法1. 统计大小王的数量(0的个数),用来填补顺子里缺失的数。
public boolean isStraight(int[] nums) {
if (nums.length != 5) {
return false;
}
Arrays.sort(nums);
int zero = 0, i = 0;
while (i < 5 && nums[i] == 0) {
zero++;
i++;// i++不能在循环里!
}
int subIndex = 5 - i - 1, gap = 0;
while (i < 5) {
if (i != 4) {
if (nums[i + 1] == nums[i]) {
return false;
}
gap += nums[i + 1] - nums[i];
}
i++;
}
return gap - zero <= subIndex;
}
方法2. 好!!!
public boolean isStraight(int[] nums) {
int joker = 0;
Arrays.sort(nums); // 数组排序
for(int i = 0; i < 4; i++) {
if(nums[i] == 0) joker++; // 统计大小王数量
else if(nums[i] == nums[i + 1]) return false;// 若有重复,提前返回 false
}
return nums[4] - nums[joker] < 5; // 最大牌 - 最小牌 < 5 则可构成顺子
}