映射在编程中的应用
1.
题目:判断断一个由a-z这26个字符组成的字符串中哪个字符出现的次数最多。
#include<stdio.h>
#include "string.h"
int main()
{
int n, Case[26], j, max;
char str[1001];
scanf("%d", &n);
for(int i=0; i<n; i++)
{
scanf("%s", str);
memset(Case, 0, sizeof(Case));
for(j=0; j<strlen(str); j++)
Case[str[j]-'a']++; //注意一下这个用法。可以说这也是一个小技巧呀。
max = 0;
for(j=0; j<26; j++)
{
if(Case[j] > Case[max])
{
max = j;
}
}
printf("%c %d\n", max+'a', Case[max]);
}
}
在这道题目中,str[i]-'a'恰好有26种不同的情况,正好对应
26个字母,我们又恰恰开了一个大小为26的数组,这个数组是
用来干什么的呢?就是用来统计对应的26个字母出现的次数的。
这种层层对应的关系,感觉确实有点美妙呀。不错。
但是下面的更是一绝呢!
2.
题目:A、B和C映射到2
D、E和F映射到3
G、H和I映射到4
J、K和L映射到5
M、N和O映射到6
P、R和S映射到7
T、U和V映射到8
W、X和Y映射到9
0、1、2、3、4、5、6、7、8、9就是它们本身了。
由以上的字符和数字来组成电话号码。可以是纯数字,可以是纯字符,可以是混合的。
电话号码一共有8位,不算'-'连接符号。
让你找出相同的号码和相同号码的次数。
#include<stdio.h>
#include "stdlib.h"
#include "string.h"
char map[]="22233344455566677778889999";
char str[80], tel_Num[100000][9];
int cmp(const void * elem1, const void * elem2)
{
return (strcmp((char *)elem1, (char *)elem2));
}
void Standard(int n) //这个程序写的十分之经典,程序的流程十分的细致。
{
int j, k;
j = k = -1;
while(k<8)
{
j++;
if(str[j]=='-')
continue;
k++;
if(k==3)
{
tel_Num[n][k]='-';
k++;
}
if(str[j]>='A' && str[j]<='Z')
{
tel_Num[n][k] = map[str[j]-'A'];
continue;
}
tel_Num[n][k] = str[j];
}
tel_Num[n][k]='\0'; //这个结束的标志在字符串结束时一定要加上。否则会出现不可预见的错误。
return;
}
int main()
{
int n, i, j;
bool flag;
scanf("%d", &n);
for(i=0; i<n; i++)
{
scanf("%s", str);
Standard(i);
}
qsort(tel_Num, n, 9, cmp);
flag = true;
i = 0;
while(i<n)
{
j = i;
i++;
while (i<n && strcmp(tel_Num[i], tel_Num[j])==0)
{
i++;
}
if(i-j>1)
{
printf("%s %d\n", tel_Num[j], i-j);
flag = false;
}
}
if(flag)
{
printf("No duplicates.\n");
}
}
map[] 这个字符串数组开的十分的好呀!
str[i]-'A'正好对应不同的下标,
map[] 中不同的下标正好对应不同的
下标对应的数字。
有了这个工具,就可以省去好多不必要的代码,
大大的简化我们的程序,使我们的思路更加的
清晰。这个恰恰体现了映射的好处呢。
我想这道题目的本意是让大家学会用映射的
数组来优化我们的代码,提高我们的做题的
效率和简化我们做题的思路,等等。
posted on 2011-09-19 22:23 More study needed. 阅读(552) 评论(0) 编辑 收藏 举报