题解 | #扑克牌大小#

扑克牌大小

http://www.nowcoder.com/practice/d290db02bacc4c40965ac31d16b1c3eb

题意:
        

方法一:
直接模拟


思路:

    遍历字符串,将其分割为两个字符串数组,
    并按下图所示规则比较两个字符串数组:

        

#include <bits/stdc++.h>

using namespace std;

unordered_map<string,int> mp;
vector<string> a;
vector<string> b;

//0表示无法比较,1表示左边大于右边,-1表示右边大于左边
int cmp(){
   
    int n1=a.size();
    int n2=b.size();
    
    if(n1==1){//左边牌数是1
        if(n2==1){//右边字符串长度为1,则比较首字符
            return mp[a[0]]>mp[b[0]]?1:-1;
        }else if(n2==2){//右边字符串是对王
            if(b[0]=="joker"||b[0]=="JOKER")
                return -1;
        }else if(n2==4){//右边字符串是炸弹
            return -1;
        }
        return 0;
    }else if(n1==2){//左边牌数是2
        if(a[0]=="joker"||a[0]=="JOKER")
            return 1;
        if(n2==2){//右边字符串长度为2,则比较首字符
            return mp[a[0]]>mp[b[0]]?1:-1;
        }else if(n2==4){//右边字符串是炸弹
            return -1;
        }
        return 0;
    }else if(n1==3){//左边牌数是3
        if(n2==3){//右边字符串长度为3,则比较首字符
            return mp[a[0]]>mp[b[0]]?1:-1;
        }else if(n2==2){//右边字符串是对王
            if(b[0]=="joker"||b[0]=="JOKER")
                return -1;
        }else if(n2==4){//右边字符串是炸弹
            return -1;
        }
        return 0;
    }else if(n1==4){//左边牌数是4
        if(n2==4){//右边字符串长度为4,则比较首字符
            return mp[a[0]]>mp[b[0]]?1:-1;
        }else if(n2==2){//右边字符串是对王
            if(b[0]=="joker"||b[0]=="JOKER")
                return -1;
        }
        return 1;
    }else if(n1==5){//左边牌数是5
        if(n2==5){//右边字符串长度为5,则比较首字符
            return mp[a[0]]>mp[b[0]]?1:-1;
        }else if(n2==2){//右边字符串是对王
            if(b[0]=="joker"||b[0]=="JOKER")
                return -1;
        }else if(n2==4){//右边字符串是炸弹
            return -1;
        }
        return 0;
    }
    return 0;
}

int main(){
    
    //初始化
    
    for(int i=3;i<=10;i++)
        mp[to_string(i)]=i;
    mp["J"]=11;
    mp["Q"]=12;
    mp["K"]=13;
    mp["A"]=14;
    mp["2"]=15;
    mp["joker"]=16;
    mp["JOKER"]=17;
    
    string s;
    while(getline(cin,s)){//输入
        a.clear();
        b.clear();
        s+=" ";
        int len=s.size();
        string x="";
        int flag=0;
        for(int i=0;i<len;i++){//遍历字符串,得到分割的单词
            if(s[i]==' '||s[i]=='-'){
                if(flag==0)
                    a.push_back(x);
                else
                    b.push_back(x);
                x="";
                if(s[i]=='-')
                    flag=1;
            }else{
                x+=s[i];
            }
        }
        int t=cmp();//比较
        if(t==0){//无法比较
            cout << "ERROR\n";
        }else if(t>0){//左边大
            for(int i=0;i<a.size();i++)
                cout << a[i] << " ";
            cout << endl;
        }else{//右边大
            for(int i=0;i<b.size();i++)
                cout << b[i] << " ";
            cout << endl;
        }
    }
    return 0;
}


时间复杂度:
空间复杂度:

方法二:
优化

思路:
        左右边字符串数组比较规则:(比较顺序)
         1.比较左右边字符串是否为对王;
         2.左右边字符串都为4的情况;
         3.左右边字符串都为1的情况;
         4.左右边字符串都为2的情况;
         5.左右边字符串都为3的情况;
         6.左右边字符串都为5的情况。
        (其中顺序3、4、5、6可以随意对调)。
        


#include <bits/stdc++.h>

using namespace std;

unordered_map<string,int> mp;
vector<string> a;
vector<string> b;

//0表示无法比较,1表示左边大于右边,-1表示右边大于左边
int cmp(){
   
    int n1=a.size();
    int n2=b.size();
    if(n1==2&&(a[0]=="joker"||a[0]=="JOKER"))//左边字符串是对王
        return 1;
    if(n2==2&&(b[0]=="joker"||b[0]=="JOKER"))//右边字符串是对王
        return -1;
    if(n1==4&&n2==4){//左右边字符串都为4
        return mp[a[0]]>mp[b[0]]?1:-1;
    }else if(n1==4)//左边字符串都为4
        return 1;
    else if(n2==4)//右边字符串都为4
        return -1;
    if(n1==5&&n2==5)//左右边字符串都为5
        return mp[a[0]]>mp[b[0]]?1:-1;
    if(n1==3&&n2==3)//左右边字符串都为3
        return mp[a[0]]>mp[b[0]]?1:-1;
    if(n1==2&&n2==2)//左右边字符串都为2
        return mp[a[0]]>mp[b[0]]?1:-1;
    if(n1==1&&n2==1)//左右边字符串都为1
        return mp[a[0]]>mp[b[0]]?1:-1;
    return 0;
}

int main(){
    
    //初始化
    
    for(int i=3;i<=10;i++)
        mp[to_string(i)]=i;
    mp["J"]=11;
    mp["Q"]=12;
    mp["K"]=13;
    mp["A"]=14;
    mp["2"]=15;
    mp["joker"]=16;
    mp["JOKER"]=17;
    
    string s;
    while(getline(cin,s)){//输入
        a.clear();
        b.clear();
        s+=" ";
        int len=s.size();
        string x="";
        int flag=0;
        for(int i=0;i<len;i++){//遍历字符串,得到分割的单词
            if(s[i]==' '||s[i]=='-'){
                if(flag==0)
                    a.push_back(x);
                else
                    b.push_back(x);
                x="";
                if(s[i]=='-')
                    flag=1;
            }else{
                x+=s[i];
            }
        }
        int t=cmp();//比较
        if(t==0){//无法比较
            cout << "ERROR\n";
        }else if(t>0){//左边大
            for(int i=0;i<a.size();i++)
                cout << a[i] << " ";
            cout << endl;
        }else{//右边大
            for(int i=0;i<b.size();i++)
                cout << b[i] << " ";
            cout << endl;
        }
    }
    return 0;
}

时间复杂度:
空间复杂度:








全部评论

相关推荐

wu970:标准北漂配置,怎么看着装修风格有点像自如的😭
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-13 16:09
我入职那天分到的mentor是个工作三年的哥们儿,外号杰哥,浙大本硕,技术贼好,人也特别耐心。第一周他手把手带我熟悉项目,下班还带我去公司食堂吃晚饭,跟我讲组里的人际关系、哪个产品好沟通、哪个测试爱挑刺。我当时心里那个踏实啊,心想这mentor是真带我,运气真好。我甚至已经开始幻想转正后跟着他干。周一下午四点多,我正在改一个特别恶心的bug,他飞书突然发我:"小x,跟你说个事儿,我下周一是最后一天,我跳槽了,你之后跟着王哥学。"我当时直接回复了“????”真的以为他在开玩笑。他发了一个尴尬笑的表情,"真的,offer上个月就拿了,一直没说"。我那一瞬间真的不知道说啥。下班的时候我特意去他工位转了一圈,他已经在收拾东西来,看见我笑了一下,说"我请你吃个饭吧"。我们去了公司楼下的麻辣烫。吃饭的时候他跟我说了很多,说大厂这边晋升路径太卷,说他家在外地啊老婆怀孕了啊想离家近点什么的,说新公司虽然小但是给的钱多。我一边吃一边点头,看到一个快到中年研发人的无奈,感觉也看到了未来的我,心里挺不是滋味的。今早上午他飞书里发我一个文档链接,是他这两年攒的项目笔记,模块分工、踩过的坑、谁负责啥都有。他说"这个你留着,遇到问题先看这个再找王哥吧"。说实话,我当时贼感动,工作的这两周,他可能是我在公司里唯一真正把我当回事儿的人了。最后,我想说兄弟们,找实习真的别只看大厂光环,mentor稳定性也是玄学之一。我现在心里有点空,感觉靠山没了
鹿LF:你mt不是才工作三年吗,怎么就中年研发人了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务