您的位置:首页 > 编程语言 > C语言/C++

(C++)剑指offer-45:扑克牌顺子(抽象建模能力)

2018-02-17 18:36 585 查看

剑指offer-45:扑克牌顺子

目录

剑指offer-45扑克牌顺子

目录
1题目描述

2答案及解析

1题目描述

LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何。为了方便起见,你可以认为大小王是0。



2答案及解析

必须满足两个条件

1. 除0外没有重复的数

2. max - min < 5

class Solution {
public:
bool IsContinuous( vector<int> numbers ) {
if(numbers.size()!=5) return false;
int max = -1;  //用于存放最大值
int min = 14;
int flag = 0;  //用二进制位来判断是否有数字重复

for(int i=0; i<numbers.size(); i++){
int num = numbers[i];
if(num<0 || num>13) return false;
if(num==0) continue;  //当num=0时,进行下一次循环

if( ( (flag>>num)&1 )== 1) return false; //前面是1,2,3,5,flag=101110,flag>>4=10(二进制)=2
flag |= (1 << num);  //假设前4个数字是1,2,3,5则,flag=0|(10)|(100)|(1000)|(100000) = 101110

if(num>max) max=num;
if(num<min) min=num;

if(max-min>=5) return false;  //最大值与最小值之间差值 >4 则不是顺子
}
return true;
}
};


关于二进制

#include<iostream>
using namespace std;

int main()
{
int flag=0;
int a[5]={1,2,3,5,4};
for(int i=0;i<4;i++){
int num = a[i];
flag |= (1 << num);
cout<<flag<<endl;
}

int x = flag>>a[4]; //flag=46=101110, x=101110>>4=10=2
int y = (x & 1);    //y=(2&1)=0;
cout<<x<<" "<<y<<endl;
}


2

6

14

46

2 0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: