扑克牌中的顺子
题目
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
思路1 排序
先对五张牌排序,然后就可以直接判断相邻两张牌之间需要多少个大王或小王来填补。
- 如果需要填补大小王的数量,大于已有大小王的数量,则返回 false .
- 相反,如果需要填补大小王的数量,小于或等于已有大小王的数量,则返回 true .
思路2 不排序,时间复杂度低一点
C++ 思路1
class Solution {
public:
bool isStraight(vector<int>& nums) {
sort(nums.begin(), nums.end());
int zero_nums=0;
for(int i=0; i<4; ++i)
{
if(nums[i]==0)
{
++zero_nums;
continue;
}
if(nums[i]==nums[i+1]) //有对子
return false;
zero_nums -= nums[i+1]-nums[i]-1; //用大小王补空缺
}
return zero_nums>=0;
}
};
C++ 思路2
class Solution {
public:
bool isStraight(vector<int>& nums) {
bool judge[15];
memset(judge, 0, sizeof(judge));
int min_value=14, max_value=0;
for(int item: nums)
{
if(item==0)
continue;
if(judge[item]) //item重复出现了
return false;
judge[item]=true;
min_value = min(item, min_value);
max_value = max(item, max_value);
}
return max_value-min_value+1<=5;
}
};
};
python
class Solution:
def isStraight(self, nums: List[int]) -> bool:
nums.sort()
zero = 0
for i in range(4):
if nums[i]==0:
zero += 1
continue
if nums[i]==nums[i+1]:
return False
zero -= nums[i+1]-nums[i]-1
return zero >= 0