题意:
方法一:
直接模拟
思路:
遍历字符串,将其分割为两个字符串数组,并按下图所示规则比较两个字符串数组:
#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; }
时间复杂度:空间复杂度: