problem
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
solution
方法一(错误)
思路过程
- 这里存在一个数学游戏
- 五张牌需要连续,那么就是这五个数的最大最小差值不能超过4
- 遍历数组,维护最大和最小值,如果遇见零,就跳过
代码
class Solution {
public boolean isStraight(int[] nums) {
// int max=Integer.MIN_VALUE;
int max=-5;
// int min=Integer.MAX_VALUE;
int min=30;
for(int i:nums){
if(i==0){
continue;
}
if(i>=max){
max=i;
continue;
}
if(i<=min){
min=i;
continue;
}
}
return max-min<5?true:false;
}
}
分析
- 那重复的怎么办?比如3,3,3,0,0
- 重复这个问题咋就没有想出来,判断为重复了,就肯定不行了呀,脑子哪里去了
- 这里存在一个不被初始化的问题,最大最小值也不能等于,让大小的值都要被判断一次
- 不可能初始(零还没被替换的时候)5个数字是一样的,因为扑克牌中只有4张相同
改进
class Solution {
public boolean isStraight(int[] nums) {
// int max=Integer.MIN_VALUE;
int max=-5;
// int min=Integer.MAX_VALUE;
int min=30;
Set<Integer> repeat=new HashSet<>();
for(int i:nums){
if(i==0){
continue;
}
if(repeat.contains(i)){
return false;
}
repeat.add(i);
if(i>max){
max=i;
}
if(i<min){
min=i;
}
}
return max-min<5?true:false;
}
}