散列
1.A1084
//一个损坏的键盘,有一些按键缺失了,所以,当输入一些句子的时候,
//有些字母对应的键就不会显示出来
//现在给了一个字符串,找出哪个按键坏了
//第一行是包含了原始字符串,第二行是打出来的字符串
//每一个字符串不会超过80个字符,每个字符串都不空
//找到坏掉的字符,并按照探查到的顺序输出,英文字母必须大写,
//每一个坏掉的键只输出一次,保证至少有一个键坏掉了
//这个题太简单了,用map或者数组的方式都可以,但是map输进去就排好序了,所以不用他
//这个题有一个问题,找出坏掉的键不难,但是如何按查找到的顺序,并且只输出一次呢
//查找到的顺序的话可以边遍历边输出,只输出一次,可以先输出到一个数组然后再输出
#include<cstdio>
#include<algorithm>
#include<map>
#include<string>
#include<iostream>
#include<cstring>
using namespace std;
int res[500];
int flag[500];
int cav(char c){//判断是不是小写字母,并把他转化为大写字母
if(c>='a'&&c<='z')return (c-('a'-'A'));
else return c;
}
int main(){
memset(flag,0,sizeof(flag));
char cho[100],cht[100];
scanf("%s",cho);
scanf("%s",cht);
int i=0,j=0,k=0;
int t1,t2;
while(cht[i]!='\0'){
flag[cav(cht[i++])]++;
}
i=0;
while(cho[i]!='\0'){
if(--flag[cav(cho[i++])]==-1)
res[j++]=cav(cho[i-1]);
}
for(i=0;i<j;i++){
printf("%c",res[i]);
}
printf("\n");
system("pause");
return 0;
}
A1092
//买还是不买
//eva想要整一个链子,上面是他最喜欢的颜色,但是店主只卖整套的
//因此,eva必须核对店主卖的哪一套里面有他喜欢的所有的颜色
//如果这套是要选的,则告诉他他要多买多少个珠子,如果这套不行
//则告诉他有多少珠子他错过了
//输入:不会超过一千个数,第一行是店主的,第二行是eva的
//输出如果是则告诉有多少需要多买的,如果不是则输出缺了多少
//思路:这个题我想还是哈希的思路,先把店主的输进去,然后
//输入eva的两个记录,一个flag,一个是的,一个是包含的,
//flag,是如果有一个没有则减减。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
char shopc[2000];//用来输入店主的产品用的
int shop[500];
char eva[2000];
int main(){
int cont,ex,flag;//cont是包含,ex是多买的,flag是是否包含
cont=ex=0;flag=1;
scanf("%s",shopc);
scanf("%s",eva);
int i;
memset(shop,0,sizeof(shop));
for(i=0;shopc[i]!='\0';i++){//标记店家每个颜色出现过几次
shop[shopc[i]]++;
ex++;
}
for(i=0;eva[i]!='\0';i++){//循环eva的找到店家是否有,有的话,cont++,ex--,flag不变,没有的话,flag=0;
if(shop[eva[i]]-->0){
cont++;
ex--;
}
else flag=0;
}
if(flag==1){
printf("Yes %d\n",ex);
}
else{
printf("No %d\n",i-cont);
}
system("pause");
return 0;
}
A1041
//火星上独一无二是很重要的,赢的规则很简单,选一个1到10e4的数
//找到独一无二的数字的人赢,输入一堆数,找到独一无二的数
//思路:把所有的按顺序存进去遍历就行
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int flag[10100];
int ssin[100100];//用来放输入的序列
int main(){
int n;
memset(flag,0,sizeof(flag));
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++){
int t;
scanf("%d",&t);
flag[t]++;
ssin[i]=t;
}
for(i=0;i<n;i++){
if(flag[ssin[i]]==1){
printf("%d\n",ssin[i]);
break;
}
}
if(i==n)
printf("None\n");
system("pause");
return 0;
}
A1050
//A1050
//给了两个字符串,S1,和S2,S=S1−S2,就是从S1里面删除S2
//剩下的字符串,长度不会超多10e4
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
char ssin[10100];
char era[10100];
int flag[10100];
int main() {
memset(flag, 0, sizeof(flag));
cin.getline(ssin,10010);
cin.getline(era,10010);
int i;
for (i = 0; era[i] != '\0'; i++) {
flag[era[i]]++;
}
for (i = 0; ssin[i] != '\0'; i++) {
if (flag[ssin[i]] == 0)
printf("%c", ssin[i]);
}
printf("\n");
system("pause");
return 0;
}