算法1
能组成顺子需要满足的两个条件是:
- 除了0以外不能出现两个相同的数字;
- 排序后两个相邻数字的差值不能大于0的个数。
按照这两个条件进行判断即可。
C++ 代码
class Solution {
public:
bool isContinuous( vector<int> numbers ) {
if(numbers.size()!=5)
return false;
sort(numbers.begin(), numbers.end());
int zerocnt = 0;
for(int i = 0;i<4;i++){
if(numbers[i]==0)
zerocnt += 1;
else{
if(numbers[i+1]-numbers[i]-1>zerocnt)//相邻数字间隔大于0的个数
return false;
if(numbers[i+1]==numbers[i])//有对子
return false;
zerocnt -= numbers[i+1] - numbers[i]-1;
}
}
return true;
}
};
class Solution {
public:
bool isContinuous( vector[HTML_REMOVED] nums ) {
int sum=0; sort(nums.begin(),nums.end()); if(nums.size()!=5) return false; for(int i=0;i<nums.size()-1;i++){ if(nums[i]==nums[i+1]&&nums[i]!=0){ return false; } } for(int i=0;i<nums.size()-1;i++){ if(nums[i]!=0&&nums[i+1]!=0){ sum=sum+nums[i+1]-nums[i]; } } if(sum>4){ return false; }else{ return true; } }
};
class Solution { public: bool isContinuous( vector<int> numbers ) { if(numbers.size() < 5) return false; //少于五张时无法组成顺子 sort(numbers.begin() , numbers.end()) ; //排序 auto it = upper_bound(numbers.begin() , numbers.end() , 0); /*排序后,0全在左边,查找第一个大于0的元素*/ int i = it - numbers.begin() , j; // i为第一个大于0的元素的下标 if(numbers[i] == 1 && numbers[numbers.size() - 1] > 5) { //如果第一个大于0 的元素为1 ,说明A为起始元素,如果五张牌的最大牌> 5 , //那么组成的牌型一定是10,J,Q ,K ,A ,此时将1修改为14,然后重新排序,使A在数组中排在K的后面 for(j = i ; j < numbers.size() && numbers[j] == 1 ; j ++) numbers[j] = 14; sort(numbers.begin() , numbers.end()); } while(i) { //对于每个0元素,找到第一个非连续数值的位置j,然后将0的值修改为numbers[j] + 1插入到原j的位置 for(j = i --; j < numbers.size() - 1 ; j ++) { int now = numbers[j]; swap(numbers[j] , numbers[j - 1]); if(now + 1 != numbers[j + 1]) break ; } numbers[j] = numbers[j - 1] + 1; } //此时1元素和0元素已经特殊处理完,若元素严格递增连续,则一定满足一个顺子 for(i = 0 ; i < numbers.size() - 1 ; i ++) if(numbers[i] + 1 != numbers[i + 1]) return false; return true; } };
先把1和0特殊处理,插入到正确的位置
class Solution {
public boolean isContinuous(int [] numbers) {
Arrays.sort(numbers);
int cz=0;
for(int i=numbers.length-1;i>0;i–){
if(numbers[i-1]!=0&&numbers[i]==numbers[i-1])return false;
if(numbers[i-1]!=0){
cz+=numbers[i]-numbers[i-1];
}else{
break;
}
}
return cz==4;
}
}
应该没有这么费劲吧
这个题解没办法判断循环的顺子 [1, 10, 11, 12, 13]
我理解的这道题的题意好像不把循环的顺子认为是顺子呀
你这种就把1变成14再去判断吧,参考代码
class Solution { public: bool isContinuous( vector<int> numbers ) { if(!numbers.size()) return false; sort(numbers.begin(),numbers.end()); int cnt = 0; bool f1 = 1; bool f2 = 1; for(auto var:numbers) if(!var) cnt++; int sum = 0; for(int i = cnt;i < numbers.size() - 1;i++) if(numbers[i+1]- numbers[i] > 1) sum += (numbers[i+1] - numbers[i] -1); if(sum > cnt) f1 = 0; for(int i = cnt;i < numbers.size() - 1;i++) if(numbers[i] == numbers[i + 1]) f1 = 0,f2 = 0; sum = 0; for(auto var:numbers) if(var == 1) var = 14; sort(numbers.begin(),numbers.end()); for(int i = cnt;i < numbers.size() - 1;i++) if(numbers[i+1]- numbers[i] > 1) sum += (numbers[i+1] - numbers[i] -1); if(sum > cnt) f2 = 0; return f1 || f2; } };