算法笔记第四章 算法初步

算法笔记第四章 算法初步

散列

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值