拼多多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,返回。

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

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

string list[13] = { "2","3","4","5","6","7","8","9","10","J","Q","K","A" };

int getIndex(string str) {
	string tmp = str.substr(1, str.size() - 1);
	for (int i = 0; i < 13; i++) {
		if (list[i] == tmp) return i;
	}
}

bool compare(string s1, string s2)
{
	if (s1[0] != s2[0]) return s1[0] < s2[0];
	string tmp1 = s1.substr(1,s1.size()-1), tmp2 = s2.substr(1, s2.size() - 1);
	int index1, index2;
	for (int i = 0; i < 13; i++) {
		if (list[i] == tmp1) index1=i;
		if (list[i] == tmp2) index2=i;
	}
	return index1 < index2;
}

bool isFlush(vector<string> &vec)
{
	sort(vec.begin(), vec.end(), compare);
	int size = vec.size();
	int count;
	for (int i = 0; i < size; i++) {
		if (i == 0) count = 1;
		else {
			int index1 = getIndex(vec[i - 1]);
			int index2 = getIndex(vec[i]);
			if (vec[i][0] == vec[i - 1][0] && index2 - index1 == 1) count++;
			else count = 1;
			if (count == 5) return true;
			//当count到达4时,如果vec[i]为5,则在vec中找是否有同花色的A
			//如果找到,直接返回true
			if (count == 4 && vec[i][1] == '5') {
				for (int j = i + 1; j < vec.size(); j++) {
					if (vec[j][0] == vec[i][0] && vec[j][1] == 'A') return true;
					if (vec[j][0] != vec[i][0]) break;
				}
			}
			
		}
	}
	return false;
}


int main()
{
	int m, n;
	cin >> m;
	vector<char> res(m);
	for (int i = 0; i < m; i++) {
		cin >> n;
		vector<string> vec(n);
		for (int j = 0; j < n; j++) {
			cin >> vec[j];
		}
		if (isFlush(vec)) res[i]='Y';
		else  res[i] = 'N';
	}
	for (int i = 0; i < m; i++) {
		cout << res[i] << endl;
	}
	system("pause");
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_26286193/article/details/80530620
今日推荐