思路是这样的:先判断是不是长度为5的数组。
除了0之外有没有重复的数?如果有,肯定不是顺子。
如果没有重复的,除了0之外的最大值减去最小值是不是≤4.
例如: 1 2 3 4 5 此时max-min等于4.
3 0 5 0 0 max-min=2,因为除了0之外已经没有重复的数了,最大值减去最小值就是当前的范围。不用管中间的数是不是存在。只要max-min不大于4,那么就能使用0来补齐顺子。
使用set来存储
class Solution {
public boolean isStraight(int[] nums) {
if(nums==null || nums.length!=5){
return false;
}
//记录每一个数字出现的次数。
HashSet<Integer> set = new HashSet<>();
int min=14;
int max=0;
for(int i =0;i<nums.length;i++){
if(nums[i]!=0 && min>nums[i] ){
min=nums[i];
}
if(max<nums[i]){
max=nums[i];
}
if(!set.contains(nums[i])){
set.add(nums[i]);
}else if(set.contains(nums[i]) && nums[i]!=0){
return false;
}
}
if(max-min<=4){
return true;
}
return false;
}
}
使用14长度的数组储存出现次数 太麻烦了。
class Solution {
public boolean isStraight(int[] nums) {
if(nums==null || nums.length!=5){
return false;
}
//记录每一个数字出现的次数。
int[] arr = new int[14];
for(int i =0;i<nums.length;i++){
arr[nums[i]]++;
}
int temp=1;
while(arr[temp]==0){
temp++;
}
//记录有多少个数字出现次数为1
int count=0;
int max=temp;
for(int i=temp;i<arr.length;i++){
if(arr[i]>1){
return false;
}
if(arr[i]==1 && i>max){
count++;
max=i;
}
}
//最大值与最小值之间有几个数没有(需要用0来补)
if((max-temp+1)<=5){
return true;
}
return false;
}
}