犯了一个错误:
我先把第i个数字放到集合中,然后去集合中找元素,这样的结果是一定可以找到的,所以应该先找后放。
解题思路:
1.对数组中数字进行排序
2.利用集合保证其不能有重复数字,如果有则直接返回失败,但是0可以重复。
3.如果2步骤没有返回,说明没有重复数字,那么此时最大与最小数字差小于5即可,此时一定可以连成顺子。
class Solution {
public:
bool isStraight(vector<int>& nums) {
//0.排序
sort(nums.begin(),nums.end());
//1.不能有重复数字
//2.数一下0的个数
set<int> s;
int zeroCnt = 0;
for(int i=0;i<5;i++){
if(nums[i]!=0&&s.find(nums[i])!=s.end()){
return false;
}
if(nums[i]==0){
zeroCnt++;
}else{
s.insert(nums[i]);
}
}
//3.如果最大最小差距小于5就ok
if((nums[4]-nums[zeroCnt])<5)
return true;
else
return false;
}
};
debug版:
#include<iostream>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
bool isStraight(vector<int>& nums) {
//0.排序
sort(nums.begin(),nums.end());
//1.不能有重复数字
//2.数一下0的个数
set<int> s;
int zeroCnt = 0;
for(int i=0;i<nums.size();i++){
if(nums[i]!=0&&s.find(nums[i])!=s.end()){
return false;
}
if(nums[i]==0){
zeroCnt++;
}else{
s.insert(nums[i]);
}
}
//3.如果最大最小差距小于5就ok
if((nums[4]-nums[zeroCnt])<5)
return true;
else
return false;
}
};
int main(){
int a[5] = {1,2,3,4,5};
vector<int> v(a,a+5);
Solution s;
if(s.isStraight(v)==true)
cout<<"true"<<endl;
}