字符串经典题之扑克牌的大小

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串经典题之扑克牌的大小相关的知识,希望对你有一定的参考价值。

题目

在这里插入图片描述

这种类型的题目不涉及算法,和我们日常的业务逻辑十分相似。最关键的一点就是思维清晰,逐步细化。

比较的时候首先比较类型,如果两副牌的数目相同,那么肯定是相同类型的,在这种情况下再去比较点数,而比较点数的时候大小完全是依靠第一张牌的点数大小决定的;一旦两幅排数目不相同,表示类型出现了差异,这种情况下必须有一方是炸弹,不然就不满足题意的输入了

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;



string find_max(const string& input)
{
    //首先上来看一下有没有王炸
    if(input.find("joker JOKER")!=string::npos)
    {
        return "joker JOKER";
    }
    //分开两幅牌
    string left=input.substr(0,input.find('-'));
    string right=input.substr(input.find('-')+1);//注意+1,不要把“-”放进第二张牌了
    //左牌和右牌的数目=空格数+1;利用算法中的count统计
    size_t left_num=count(left.begin(),left.end(),' ')+1;
    size_t right_num=count(right.begin(),right.end(),' ')+1;
    
    //如果左面和右面的数量相等,那就说明类型相同
    if(left_num==right_num)
    {
        //首先拿出左面和右面的第一章牌
        string left_first=left.substr(0,left.find(' '));
        string right_first=right.substr(0,right.find(' '));
        //类型相同就比较点数
        string compare("345678910JQKA2jokerJOKER");
        if(compare.find(left_first) > compare.find(right_first))
        {
            //如果左大于有
            return left;
        }
        else
        {
            return right;
        }
    }
    
    //如果数量不相等,那么有可能是炸弹导致的
    if(left_num==4)
    {
        return left;
    }
    else if(right_num==4)
    {
        return right;
    }
    else//数量不相等,无法比较
    {
        return "ERROR";
    }

}


int main()
{
    string input;//接受输入
    string ret;//返回情况
    while(getline(cin,input))
    {
        ret=find_max(input);
        cout<<ret<<endl;
    }
    return 0;
    
}

以上是关于字符串经典题之扑克牌的大小的主要内容,如果未能解决你的问题,请参考以下文章

动态规划经典题之编辑距离

字符串经典题之大数相加

字符串经典题之参数解析

前端面试题之手写promise

字符串经典题之正则匹配字符串

C经典面试题之深入解析sprintfstrcpy和memcpy的使用与区别