方法一:使用二维字符数组存储,利用字符串函数比较去重
#include<bits/stdc++.h>
using namespace std;
int n;
char a[62][3]; //注意此处第二维数组需要开3否则会出现未知错误
int cnt;//用于统计去重后的个数
int main()
{
//cout<<strcmp("dd", "dd")<<" "<<strcmp("da", "dd")<<" "<<strcmp("dd", "da");
cin>>n;
for(int i=1; i<=n; i++){
char t[3];
cin>>t;
bool b=0;//假定之前的扑克牌中没有相同的
for(int j=0; j<cnt; j++){//和之前的扑克牌一一比较
// cout<<a[j]<<endl;//测试代码
if(strcmp(a[j], t)==0){//字符串比较函数
b=1;break;
}
}
if(!b){
strcpy(a[cnt], t);//将字符串t复制给a[cnt]
cnt++;
}
}
cout<<52-cnt;
return 0;
}
方法二:使用C++中的string, 思路和方法一一致,区分两种写法
#include<bits/stdc++.h>
using namespace std;
int n;
string s[62];
int cnt;//用于统计去重后的个数
int main()
{
cin>>n;
for(int i=1; i<=n; i++){
string t;
cin>>t;
bool b=0;//假定之前的扑克牌中没有相同的
for(int j=0; j<cnt; j++){//和之前的扑克牌一一比较
if(s[j]==t){//string比较
b=1;break;
}
}
if(!b){
s[cnt]=t;//将字符串t赋值给a[cnt]
cnt++;
}
}
cout<<52-cnt;
return 0;
}
方法三:对每张牌的 2 个字符ASSCII码重新编码成不一样的数字,如SA编码成4*100+1,使用哈希去重即可
#include<bits/stdc++.h>
using namespace std;
int n;
char c[3];
bool a[500];//用于标记每张牌是否出现
int cnt;
int f1(char ch){
if(ch=='D')return 1;
if(ch=='C')return 2;
if(ch=='H')return 3;
if(ch=='S')return 4;
}
int f2(char ch){
if(ch=='A')return 1;
if(ch=='2')return 2;
if(ch=='3')return 3;
if(ch=='4')return 4;
if(ch=='5')return 5;
if(ch=='6')return 6;
if(ch=='7')return 7;
if(ch=='8')return 8;
if(ch=='9')return 9;
if(ch=='T')return 10;
if(ch=='J')return 11;
if(ch=='Q')return 12;
if(ch=='K')return 13;
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++){
int s=0;
cin>>c;
s=f1(c[0])*100+f2(c[1]);//每张牌的数字编码为花色*100+点数
a[s]=1;
}
for(int i=101; i<=413; i++)
if(a[i])
cnt++;
cout<<52-cnt;
return 0;
}
方法四:使用C++中STL中的set
#include<iostream>
#include<set>
using namespace std;
int n;
string s;
set <string> poker;
int main()
{
cin>>n;
for(int i=1; i<=n; i++){
cin>>s;
poker.insert(s);
}
cout<<52-poker.size();
return 0;
}
方法五:源自网络