描述
现在有n张扑克牌,每张扑克牌都有点数和花色两部分组成。点数为‘1’-‘9’的正整数,花色为'C','D','H','S''其中的一个,分别表示梅花、方块、红桃、黑桃。现在想按一定的顺序把这n张牌扔掉。扔牌顺序的规则如下1.:
1.如果现在还剩素数张牌,则将牌顶的牌扔掉
2.如果现在还剩非素数张牌,则将牌底的牌扔掉
求扔牌顺序是什么,请返回扔牌顺序的字符串
示例1
输入:
"3C8D6H3D"
复制返回值:
"3D3C8D6H"
复制说明:
开始n=4,为非素数,扔掉牌底的牌3D
n=3,为素数,扔掉牌顶的牌3C
n=2,为素数,扔掉牌顶的牌8D
n=1,为非素数,扔掉牌底的牌6H
示例2
输入:
"8S8S8S8S8S8S8S"
返回值:
"8S8S8S8S8S8S8S"
说明:
因为全是8S,所以扔牌顺序的每一张牌也都是8S
备注:
对于100%的数据,1≤n≤10
以下是C++代码实现:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
/**
*
* @param x string字符串 字符串从前到后分别是从上到下排列的n张扑克牌
* @return string字符串
*/
string Orderofpoker(string x) {
vector<string> cards;
string temp;
for (int i = 0; i < x.size(); i++) {
if (i == x.size() - 1 || x[i] != x[i + 1]) {
temp += x[i];
cards.push_back(temp);
temp = "";
} else {
temp += x[i];
}
}
sort(cards.begin(), cards.end(), [](string a, string b) {
if (a.size() == b.size()) {
return a < b;
} else {
return a.size() > b.size();
}
});
string result = "";
for (string card : cards) {
result += card;
}
return result;
}
};
在这个实现中,我们定义了一个名为Solution
的类,其中包含一个名为Orderofpoker
的公共方法。该方法接收一个字符串参数x
,表示从上到下排列的n张扑克牌,并返回一个字符串,表示扔牌顺序的字符串。
在方法中,首先定义了一个名为cards
的vector<string>
,用于存储每张牌。然后定义了一个名为temp
的字符串,用于存储当前正在处理的牌。接下来,使用一个for
循环遍历输入字符串x
中的每个字符,如果当前字符与下一个字符不同,则表示当前牌已经处理完毕,将其添加到cards
中,并清空temp
。否则,将当前字符添加到temp
中。
接下来,使用sort
函数对cards
进行排序,排序规则如下:
- 如果两张牌的点数相同,则按照花色的字典序进行排序。
- 如果两张牌的点数不同,则按照点数从大到小的顺序进行排序。
最后,使用一个for
循环遍历cards
中的每张牌,将它们按照排序后的顺序添加到result
字符串中,并返回result
。