映射在編程中的應(yīng)用
1.
題目:判斷斷一個(gè)由a-z這26個(gè)字符組成的字符串中哪個(gè)字符出現(xiàn)的次數(shù)最多。
#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']++; //注意一下這個(gè)用法。可以說這也是一個(gè)小技巧呀。
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種不同的情況,正好對(duì)應(yīng)
26個(gè)字母,我們又恰恰開了一個(gè)大小為26的數(shù)組,這個(gè)數(shù)組是
用來干什么的呢?就是用來統(tǒng)計(jì)對(duì)應(yīng)的26個(gè)字母出現(xiàn)的次數(shù)的。
這種層層對(duì)應(yīng)的關(guān)系,感覺確實(shí)有點(diǎn)美妙呀。不錯(cuò)。
但是下面的更是一絕呢!
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就是它們本身了。
由以上的字符和數(shù)字來組成電話號(hào)碼??梢允羌償?shù)字,可以是純字符,可以是混合的。
電話號(hào)碼一共有8位,不算'-'連接符號(hào)。
讓你找出相同的號(hào)碼和相同號(hào)碼的次數(shù)。
#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) //這個(gè)程序?qū)懙氖种?jīng)典,程序的流程十分的細(xì)致。
{
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'; //這個(gè)結(jié)束的標(biāo)志在字符串結(jié)束時(shí)一定要加上。否則會(huì)出現(xiàn)不可預(yù)見的錯(cuò)誤。
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[] 這個(gè)字符串?dāng)?shù)組開的十分的好呀!
str[i]-'A'正好對(duì)應(yīng)不同的下標(biāo),
map[] 中不同的下標(biāo)正好對(duì)應(yīng)不同的
下標(biāo)對(duì)應(yīng)的數(shù)字。
有了這個(gè)工具,就可以省去好多不必要的代碼,
大大的簡(jiǎn)化我們的程序,使我們的思路更加的
清晰。這個(gè)恰恰體現(xiàn)了映射的好處呢。
我想這道題目的本意是讓大家學(xué)會(huì)用映射的
數(shù)組來優(yōu)化我們的代碼,提高我們的做題的
效率和簡(jiǎn)化我們做題的思路,等等。
posted on 2011-09-19 22:23 More study needed. 閱讀(569) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)