
思路是这样的:先判断是不是长度为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;
}
}
该博客讨论了一种检查5个整数是否能构成顺子的算法。通过排除重复数字和计算最大值与最小值的差值,可以判断是否能用0补全数组形成连续序列。文章提供了两种不同的实现方式,一种使用HashSet,另一种使用计数数组,均关注于效率和简洁性。
876

被折叠的 条评论
为什么被折叠?



