字符串轉下標
方法1:
#include<cstring>
#include<cstdio>
using namespace std;
struct Ball
{
char color[20];
int num;
}ball[1005];
int cnt=1;
void count_num(char ch[])
{
int i;
for(i=0;i<cnt;i++)
{
if(strcmp(ch,ball[i].color)==0)//遍歷結構體數組,看前面是否出現過相同的字符串
{
ball[i].num++;
return ;
}
}
if(i==cnt)
{
strcpy(ball[cnt].color,ch);
ball[cnt].num++;
cnt++;
}
}
int main()
{
int n,i;
char ch[20];
while(scanf("%d",&n)&&n)
{
for(int j=0;j<n;j++)
ball[j].num=0;
scanf("%s",ch);
strcpy(ball[0].color,ch);
ball[0].num=1;
cnt=1;
for(i=1;i<n;i++)
{
scanf("%s",ch);
count_num(ch);
}
int Max=-1;
int index=-1;
for(int i=0;i<n;i++)
{
printf("%s:%d\n",ball[i].color,ball[i].num);
if(Max<ball[i].num)
{
Max=ball[i].num;
index=i;
}
}
printf("%s\n",ball[index].color);
}
return 0;
}
方法2:
map容器
map<string,int> Hash
map初始化為0,如果第一個關鍵字Hash[string]為0,則說明該關鍵字第一次出現,反之,如果不為0,則說明前面出現過
#include <cstdio>
#include <map>
#include <string>
#include <iostream>
using namespace std;
map<string, int> Hash;
int par[1000005];
void init(int n)
{
for(int i=0;i<n;i++)
{
par[i]=i;
}
}
int Find(int x)
{
if(par[x]==x)
{
return x;
}
return par[x]=Find(par[x]);
}
void Unite(int x,int y)
{
x=Find(x);
y=Find(y);
if(x==y)
return ;
else{
par[y]=x;
}
}
int main () {
int n, a, cnt = 1;
string x, y;
scanf("%d",&n);
getchar();
init(1000005);
while (n --) {
cin>>a>>x>>y;
if (a == 0) {
if (!Hash[x]) {
Hash[x] = cnt ++;
}
if (!Hash[y]) {
Hash[y] = cnt ++;
}
Unite (Hash[x], Hash[y]);
} else {
if (!Hash[x]) {
Hash[x] = cnt ++;
}
if (!Hash[y]) {
Hash[y] = cnt ++;
}
if (Find(Hash[x]) == Find (Hash[y])) {
printf("yes\n");
} else {
printf("no\n");
}
}
}
return 0;
}
字符串轉下標