扑克牌有56张,大小王分别为两张。随机抽出几张牌,判断能不能组成顺子。大小王可以用0表示。并且大小王可以代替任何牌。
使用辅助数组,将输入的元素对应到辅助数组之上。如果最大值max与最小值min的差值小于5,说明可以组成顺子。
public boolean isContinuous(int [] numbers) {
if(numbers == null || numbers.length < 5) return false; //输入判断
int[] flag = new int[14]; //0-13,共14种输入可能
flag[0] = -5; //大小王共4张
int max = -1,min = 14;
for(int i=0;i<numbers.length;i++){
flag[numbers[i]]++; //辅助数组对应位置+1
if(numbers[i] == 0) { //遇到大小王,跳过,大小王可以看成任何值,不影响
continue;
}
if(flag[numbers[i]] > 1) return false; //出现重复元素
if(numbers[i] > max) max = numbers[i]; //记录最大值
if(numbers[i] < min) min = numbers[i]; //记录最小值
}
if(max - min < 5) return true; //最大最小差值小于5
return false;
}
使用Set集合元素不重复的特点,如果当前元素不为0,并且已经存在于Set集合中,返回false。
public class Solution {
public boolean isContinuous(int [] numbers) {
if(numbers == null || numbers.length < 5) return false;
HashSet<Integer> set = new HashSet<>();
int max = -1,min = 14;
for(int i=0;i<numbers.length;i++){
//当前元素不为0,并且重复
if(set.contains(numbers[i]) && numbers[i] != 0) return false;
set.add(numbers[i]);
if(numbers[i]>max && numbers[i]!=0) max = numbers[i];
if(numbers[i]<min && numbers[i]!=0) min = numbers[i];
}
if(max-min < 5) return true;
return false;
}
}
public boolean isContinuous(int [] numbers) {
if(numbers == null || numbers.length < 5) return false;
int count = 0; //记录0出现的次数
int interval = 0; //记录差值
Arrays.sort(numbers);
for(int i=0;i<numbers.length-1;i++){
if(numbers[i] == 0){
count++;
continue;
}
if(numbers[i] == numbers[i+1]) return false;
interval += numbers[i+1] - numbers[i] - 1; //记录相邻元素的差值总和
}
if(count >= interval){ //0的个数小于差值,返回false
return true;
}
return false;
}
原文:https://www.cnblogs.com/le-le/p/12789841.html