题目链接
扑克牌大小_牛客题霸_牛客网
题目完整代码
#include <iostream>
#include<string>
#include<algorithm>
using namespace std;
// left_str 左边牌
// right_str 右边牌
// left_count 左边牌数
// right_count 右边牌数
// left_first 左边第一个牌
// right_first 右边第一个牌
// 获取两边手牌中最大的手牌
string getMax(string s)
{
// 倘若其中以防是王炸那么直接返回王炸即可
if(s.find("joker JOKER")!=-1)
return "joker JOKER";
// 用find来确定分隔符的位置
int k=s.find('-');
// 使用left_str来记录左边的牌,主要是用substr来分割
string left_str=s.substr(0,k);
// 使用right_str来记录右边的牌,主要是用substr来分割
string right_str=s.substr(k+1);
// 使用left_count来记录左边牌的数量,主要用count计算,其实就是空格数加一
int left_count=count(left_str.begin(),left_str.end(),' ')+1;
// 使用right_count来记录右边牌的数量,主要用count计算,其实就是空格数加一
int right_count=count(right_str.begin(),right_str.end(),' ')+1;
// 来记录左边牌中首个字符
string left_first=left_str.substr(0,left_str.find(' '));
// 来记录右边牌中首个字符
string right_first=right_str.substr(0,right_str.find(' '));
// 若他们的数量相等
if(left_count==right_count)
{
string str="345678910JQKA2jokerJOKER";
// 首字符大的一方大
if(str.find(left_first)>str.find(right_first))
return left_str;
return right_str;
}
// 若有一方为炸弹(4个一样的牌),然而另外一方又不是炸弹,直接返回炸弹
if(left_count==4)
return left_str;
else if(right_count==4)
return right_str;
// 其他要求都不符合,返回ERROR
else
return "ERROR";
}
int main()
{
string s,res;
// 使用getline接受字符串,单纯使用cin>>s;不能接受空格
while(getline(cin,s))
{
res=getMax(s);
cout<<res<<endl;
}
return 0;
}
题目所用到的接口
string中的find()
函数原型
size_t find(const string& str);
find后边小括号上填入我们需要查找的字符串或者字符。
返回值
查找成功,返回值返回我们查到该字符或者字符串的下标。
查找失败,返回string::npo或者-1;(这两个用哪个都可以)
string中的substr()
函数原型
string substr (size_t pos = 0, size_t len = npos) const;
参数
- 可以有两个参数,作用是复制该字符串两个下标之间的内容。
- 也可以只写一个参数,作用是复制该下标到字符串末尾的内容。
count
所用库函数
#include<algorithm>
函数原型
count (InputIterator first, InputIterator last, const T& val);
参数
前两个参数是迭代器,最后一个参数是我们需要计数的字符。
也就是计数这两个迭代器之间该字符出现的次数。
返回值
返回查找到的字符数量。
getline
stirng中的一个用来输入字符串的函数。
函数作用
string s;
getline(cin,s);
可以将空格业输入到指定的字符串里面,这个单纯使用cin>>s;是做不到的。