来自力扣:
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,
而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
示例 1:
输入: [1,2,3,4,5]
输出: True
示例 2:
输入: [0,0,1,2,5]
输出: True
限制:
数组长度为 5
数组的数取值为 [0, 13] .
#include
using namespace std;
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
class Solution {
public:
bool isStraight(vector<int>& nums) {
sort(nums.begin(), nums.end());
int numszero = 0;
for (int i = 0; i < 4; ++i) {
if (nums[i] == 0) {
numszero++;
}
else {
if (nums[i] == nums[i + 1])
return false;
}
}
if (nums[4] - nums[numszero] > 4)
return false;
return true;
}
};
int main() {
Solution mysolution;
vector<int> nums = { 0,0,1,2,6 };
bool knum = mysolution.isStraight(nums);
cout << knum;
return 0;
}
思路:要判断五个数字是否是顺子,只需要确保两点,1:最大的数字与最小的数字差值小于4。2:没有重复的数字。
做法:1先从大到小排序,2遍历vector,0则记下来;不是0则看看他和下一个数字是否相同,如果相同则肯定不是顺子,直接返回false。3判断非零的数中最大值-最小值是否大于4,大于4肯定也是顺子,直接返回false。4返回true。
class Solution {
public:
bool isStraight(vector<int>& nums) {
int hash[14]={0};
int king=0,max_num=0,min_num=14;
for(int num:nums){
if(num==0)
king++;
else{
if(hash[num]>=1)
return false;
hash[num]++;
max_num=max(max_num,num);
min_num=min(min_num,num);
}
}
if(max_num-min_num<=4)
return true;
return false;
}
};
思路是一样的,我就不解释了。
做法的话,它用了用了个表来记录是否有重复的。这个的优点是不需要像我一样去sort,但坏处是占用过多空间。
上次做了道题(题没啥难的,就没做笔记),我看到里面用了这个函数,而且还自己定义了一个compare函数,所以这次既然用了就顺便记录一下笔记。
功能:排序,默认从小到大排序。
参数:起始位置,结束位置,排序的方法[没有的话就默认是从小到大排序]
需引入的头文件:#include
int main() {
vector<int> nums = { 10,0,1,7,6 };
sort(nums.begin(), nums.end());
for (auto num : nums) {
cout << num << "\t";
}
return 0;
}
int main() {
vector<int> nums = { 10,0,1,7,6 };
sort(nums.rbegin(), nums.rend());
for (auto num : nums) {
cout << num << "\t";
}
return 0;
}
vector.rbegin(),vector.begin(),vector.rend(),vector.end()这四个的差异如下图:
bool compare(int a, int b) {
return a > b;
}
int main() {
vector<int> nums = { 10,0,1,7,6 };
sort(nums.begin(), nums.end(),compare);
for (auto num : nums) {
cout << num << "\t";
}
return 0;
}