【双向线性扫描+环形队列】亚马逊笔试题:扑克牌比大小
2014-10-09 17:13
423 查看
两个4张的扑克牌比较大小:
A可以看成14,JQK对应11 12 13.
有六种牌的类型。
比较麻烦,100+行逻辑才搞定。
先要读数,并记录各个牌的出现个数:scanf=>buf[] =>a[]=>cntNum[1~4][]
然后判断a[]是哪种类型扑克牌:顺子?豹子?双对?对子?大头?
尤其是判断顺子比较麻烦,有一种特殊情况:注意QKA2也是顺子。
判断方法:
sort(a,a+4)
考虑顺子的特殊情况:
如果a[0]==2,a[3]=A,
那么a[i]从左到右扫描,a[j]从右到左扫描,判断是否a[i]=a[i-1]+1,a[j]=a[j-1]+1,最后i==j则是特殊情况。否则是大头。特殊情况下决定其大小的是a[i]这张牌。把它放到a[3]位置上,后面要用到。
考虑顺子普通情况:递增。
再判断相同类型的扑克牌的大小。非顺子,从cntNum[4]到cntNum[1]进行比较。顺子只比较a[3]即顺子最后一张牌即可。
A可以看成14,JQK对应11 12 13.
有六种牌的类型。
比较麻烦,100+行逻辑才搞定。
先要读数,并记录各个牌的出现个数:scanf=>buf[] =>a[]=>cntNum[1~4][]
然后判断a[]是哪种类型扑克牌:顺子?豹子?双对?对子?大头?
尤其是判断顺子比较麻烦,有一种特殊情况:注意QKA2也是顺子。
判断方法:
sort(a,a+4)
考虑顺子的特殊情况:
如果a[0]==2,a[3]=A,
那么a[i]从左到右扫描,a[j]从右到左扫描,判断是否a[i]=a[i-1]+1,a[j]=a[j-1]+1,最后i==j则是特殊情况。否则是大头。特殊情况下决定其大小的是a[i]这张牌。把它放到a[3]位置上,后面要用到。
考虑顺子普通情况:递增。
再判断相同类型的扑克牌的大小。非顺子,从cntNum[4]到cntNum[1]进行比较。顺子只比较a[3]即顺子最后一张牌即可。
#include <iostream> #include <algorithm> #include <vector> #include <stdio.h> using namespace std; // #define DEBUG false // #define cout if(DEBUG) cout int cmp(vector<vector<int> >&a,vector<vector<int> >&b,int type){ switch(type){ case 1://four return a[4][0]-b[4][0]; case 2://string #### return a[1][3]-b[1][3]; case 3://one three, one one return a[3][0]!=b[3][0]?a[3][0]-b[3][0]:a[1][0]-b[1][0]; case 4://two pair return a[2][1]!=b[2][1]?a[2][1]-b[2][1]:a[2][0]-b[2][0]; case 5://one pair return a[2][0]!=b[2][0]?a[2][0]-b[2][0]:a[1][1]!=b[1][1]?a[1][1]-b[1][1]:a[1][0]-b[1][0]; case 6: return a[1][3]!=b[1][3]?a[1][3]-b[1][3]:a[1][2]!=b[1][2]?a[1][2]-b[1][2]: a[1][1]!=b[1][1]?a[1][1]-b[1][1]:a[1][0]-b[1][0]; default: return 0; } } void init(char buf[],vector<vector<int> > & cntNum,int &type){ int a[4]; for(int i=0,j=0;j<=3&&buf[i]!=0;j++){ switch(buf[i]){ case 'A': a[j]=14;i+=2;break; case 'J': a[j]=11;i+=2;break; case 'Q': a[j]=12;i+=2;break; case 'K': a[j]=13;i+=2;break; case '1': a[j]=10;i+=3;break; default: a[j]=buf[i]-'0';i+=2; break; } } sort(a,a+4); // for(int i=0;i<4;i++) cout<<a[i]<<"--";cout<<endl; int cnt=0,same=0,maxSame=0,lst=-1; for(int i=0;i<=4;i++){ if(i==4||a[i]!=lst){ if(lst!=-1) cntNum[same].push_back(lst); cnt++; if(i==4) break; lst=a[i]; same=1; } else { same++; maxSame=max(same,maxSame); } } if(cnt==1) type=1; else if(cnt==2){ if(maxSame==2) type=4; else type=3; } else if(cnt==3){ type=5; } else{ type=2; if(a[0]==2&&a[3]==14){ int i=1,j=3; while(i<4&&a[i]==a[i-1]+1) i++; while(j>=0&&a[j]==a[j-1]+1) j--; if(i!=j) type=6; else{ cntNum[1][3]=a[i-1]; } } else{ int i=1; while(i<4){ if(a[i]!=a[i-1]+1) { type=6; break; } i++; } } } // cout<<"type:"<<type<<endl; } int main() { /* Enter your code here. Read input from STDIN. Print output to STDOUT */ vector<vector<int> > as(4,vector<int>()); vector<vector<int> > bs(4,vector<int>()); int ta,tb; char buf[1000]; scanf("%s",buf); // cout<<buf<<endl; init(buf,as,ta); scanf("%s",buf); // cout<<buf<<endl; init(buf,bs,tb); if(ta!=tb){ printf("%d\n",ta>tb?-1:1); } else{ int s=cmp(as,bs,ta); printf("%d\n",s>0?1:s==0?0:-1); } return 0; }
相关文章推荐
- 华为笔试_扑克牌大小
- 笔试算法题(54):快速排序实现之单向扫描、双向扫描(single-direction scanning, bidirectional scanning of Quick Sort)
- 华为2016校园招聘上机笔试题----扑克牌大小
- 华为2016笔试-扑克牌大小比较游戏
- 华为2016校园招聘上机笔试题:扑克牌大小 [python]
- 队列(Queue)--环形队列、优先队列和双向队列
- 华为2016年校园招聘上机笔试题(3)----扑克牌大小
- 华为2016校招笔试编程题(扑克牌大小)
- 亚马逊 在线笔试 2014-10-9 比较扑克牌序列
- 华为2016校园招聘上机笔试题2扑克牌大小
- 栈,队列,单链表,双向链表
- 亚马逊2015校招在线笔试2
- 比较线性表的大小
- deque双向队列
- POJ - 2823 Sliding Window【单调队列 + 双向队列】
- STL系列之一 deque双向队列
- 数据结构-环形队列(FIFO)多字节读写
- Android改变系统自带环形ProgressBar的大小
- 编程题——判断扑克牌大小
- STL系列之一 deque双向队列