当前位置:   article > 正文

拼多多2018暑期实习招聘在线编程题:同花顺_拼多多同花顺题目

拼多多同花顺题目

题目描述:给定一组扑克牌,判断其中是否存在五张扑克牌组成同花顺的牌型。

每张扑克牌由花色和点值组成。花色包括:黑桃(S)、红桃(H)、梅花(C)、方片(D);点值从小到大包括:2、3、4、5、6、7、8、9、10、J、Q、K、A。

组成同花顺的五张牌需要满足两个条件:

1、花色都相同:

2、连成顺子,或者点值为A、2、3、4、5;

输入描述:每张扑克牌通过花色和点值拼接成的一个字符串表示,例如红桃10为H10,方片A表示成DA。

第一行输入一个正整数,表示输入用例数。

第二行开始,每行输入一个用例,每个用例先输入一个正整数m,表示总的扑克牌数。紧接着输入m个扑克牌。

每个用例里的扑克牌都从一副牌中抽取。

输出描述:对应每个输入用例输出一行结果,包含一个字符。Y表示存在五张牌组成同花顺,N表示不存在。

题目给出的输入示例貌似并不符合题目要求,第3、4行的输入都出现了相同的牌HK,不知道是不是因为出题的失误。按照本文的做法,如果一行中出现相同的牌,程序将会产生异常。

下面是我的C++代码。

我的方法是:

1、首先对牌按照花色分组,每个分组按照2、3、4、5、6、7、8、9、10、J、Q、K、A的顺序排序。

2、从第二张开始遍历经过分组和排序的牌堆。用一个整型count来计数。count初值设置为1。如果遍历到的牌跟前一张牌花色相同且牌面值为前一张牌+1,则count++。否则count=1。

因为要考虑A、2、3、4、5这种情况,所以当count=4时,如果此时读取到的牌为4,往后找跟它相同花色的A。如果能找到,说明可以组成A、2、3、4、5,返回。

为了方便起见,就不按照在线编程的要求进行多次重复输入验证了,只测试一组输入。

  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5. using namespace std;
  6. string list[13] = { "2","3","4","5","6","7","8","9","10","J","Q","K","A" };
  7. int getIndex(string str) {
  8. string tmp = str.substr(1, str.size() - 1);
  9. for (int i = 0; i < 13; i++) {
  10. if (list[i] == tmp) return i;
  11. }
  12. }
  13. bool compare(string s1, string s2)
  14. {
  15. if (s1[0] != s2[0]) return s1[0] < s2[0];
  16. string tmp1 = s1.substr(1,s1.size()-1), tmp2 = s2.substr(1, s2.size() - 1);
  17. int index1, index2;
  18. for (int i = 0; i < 13; i++) {
  19. if (list[i] == tmp1) index1=i;
  20. if (list[i] == tmp2) index2=i;
  21. }
  22. return index1 < index2;
  23. }
  24. bool isFlush(vector<string> &vec)
  25. {
  26. sort(vec.begin(), vec.end(), compare);
  27. int size = vec.size();
  28. int count;
  29. for (int i = 0; i < size; i++) {
  30. if (i == 0) count = 1;
  31. else {
  32. int index1 = getIndex(vec[i - 1]);
  33. int index2 = getIndex(vec[i]);
  34. if (vec[i][0] == vec[i - 1][0] && index2 - index1 == 1) count++;
  35. else count = 1;
  36. if (count == 5) return true;
  37. //当count到达4时,如果vec[i]为5,则在vec中找是否有同花色的A
  38. //如果找到,直接返回true
  39. if (count == 4 && vec[i][1] == '5') {
  40. for (int j = i + 1; j < vec.size(); j++) {
  41. if (vec[j][0] == vec[i][0] && vec[j][1] == 'A') return true;
  42. if (vec[j][0] != vec[i][0]) break;
  43. }
  44. }
  45. }
  46. }
  47. return false;
  48. }
  49. int main()
  50. {
  51. int m, n;
  52. cin >> m;
  53. vector<char> res(m);
  54. for (int i = 0; i < m; i++) {
  55. cin >> n;
  56. vector<string> vec(n);
  57. for (int j = 0; j < n; j++) {
  58. cin >> vec[j];
  59. }
  60. if (isFlush(vec)) res[i]='Y';
  61. else res[i] = 'N';
  62. }
  63. for (int i = 0; i < m; i++) {
  64. cout << res[i] << endl;
  65. }
  66. system("pause");
  67. return 0;
  68. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/703682
推荐阅读
相关标签
  

闽ICP备14008679号