题目链接:点击打开链接
题目大意:略
解题思路
相关企业
- 字节跳动
AC 代码
- Java
// 解决方案(1)
class Solution {
public boolean isStraight(int[] nums) {
Set<Integer> repeat = new HashSet<>();
int max = 0, min = 14;
for(int num : nums) {
if(num == 0) continue; // 跳过大小王
max = Math.max(max, num); // 最大牌
min = Math.min(min, num); // 最小牌
if(repeat.contains(num)) return false; // 若有重复,提前返回 false
repeat.add(num); // 添加此牌至 Set
}
return max - min < 5; // 最大牌 - 最小牌 < 5 则可构成顺子
}
}
// 解决方案(2)
class Solution {
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 则可构成顺子
}
}
// 解决方案(3)
class Solution {
public boolean isStraight(int[] nums) {
// 计数排序思想
int[] count = new int[14];
for (int i = 0; i < nums.length; i++) {
count[nums[i]]++;
if (count[nums[i]] > 1 && nums[i] != 0) {
return false;
}
}
// 查找左右区间
boolean flagL = true, flagR = false;
int idxL = -1, idxR = -1;
for (int i = 1; i < count.length; i++) {
if (flagL && count[i] == 1) {
idxL = i;
flagL = false;
flagR = true;
} else if (flagR && count[i] == 1) {
idxR = i;
}
}
// 计算缺少坑位数
int needCnt = 0;
for (int i = idxL; i <= idxR; i++) {
if (count[i] == 0) {
needCnt++;
}
}
return needCnt <= count[0];
}
}
- C++
// 解决方案(1)标签:false,nums,int,++,61,num,return,顺子,LeetCode From: https://blog.51cto.com/u_10980859/5734070
class Solution {
public:
bool isStraight(vector<int>& nums) {
unordered_set<int> repeat;
int ma = 0, mi = 14;
for(int num : nums) {
if(num == 0) continue; // 跳过大小王
ma = max(ma, num); // 最大牌
mi = min(mi, num); // 最小牌
if(repeat.find(num) != repeat.end()) return false; // 若有重复,提前返回 false
repeat.insert(num); // 添加此牌至 Set
}
return ma - mi < 5; // 最大牌 - 最小牌 < 5 则可构成顺子
}
};
// 解决方案(2)
class Solution {
public:
bool isStraight(vector<int>& nums) {
int joker = 0;
sort(nums.begin(), nums.end()); // 数组排序
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 则可构成顺子
}
};