Description
Edward, a poor copy typist, is a user of the Dvorak Layout. But now he has only a QWERTY Keyboard with a broken Caps Lock key, so Edward never presses the broken Caps Lock key. Luckily, all the other keys on the QWERTY keyboard work well. Every day, he has a lot of documents to type. Thus he needs a converter to translate QWERTY into Dvorak. Can you help him?
The QWERTY Layout and the Dvorak Layout are in the following:
The QWERTY Layout |
---|
|
The Dvorak Layout |
---|
|
Input
A QWERTY document Edward typed. The document has no more than 100 kibibytes. And there are no invalid characters in the document.
Output
The Dvorak document.
Sample Input
Jgw Gqm Andpw a H.soav Patsfk f;doe Nfk Gq.d slpt a X,dokt vdtnsaohe Kjd yspps,glu pgld; aod yso kd;kgluZ 1234567890 `~!@#$%^&*()}"']_+-=ZQqWEwe{[\| ANIHDYf.,bt/ ABCDEFuvwxyz
Sample Output
Hi, I'm Abel, a Dvorak Layout user. But I've only a Qwerty keyboard. The following lines are for testing: 1234567890 `~!@#$%^&*()+_-={}[]:"'<>,.?/\| ABCDEFuvwxyz AXJE>Ugk,qf;
这样字符一一对应的问题,只能打表对应,然后从里面找对应的字符,有个小技巧,就是没有改变位置的字符,不需要打表对应,直接按原样输出就可以了,然后别的字符再进行相应的处理,这个题有两个需要注意的地方,第一个:注意 双引号 这个字符的表示形式是转义字符的形式,否则直接写数组里,会出问题,另外注意样例的长度,题上说的是,也就是十万多一些,很多人没注意看,就会一直错误了,开大点就行,平时做题,时间和空间足够的话,就选择最简单,最直接,也最省功夫的做法,实在不行再想算法解决,毕竟解决问题才是硬道理,而不是看你用了什么高难度的算法技巧,个人理解,大神勿喷。
#include<stdio.h>
#include<string.h>
char x[105]= {" -=_+qwertyuiop[]QWERTYUIOP{}asdfghjkl;'ASDFGHJKL:\"zxcvbnm,./ZXCVBNM<>?"}; //注意转义字符的用法
char y[105]= {" []{}',.pyfgcrl/=\"<>PYFGCRL?+aoeuidhtns-AOEUIDHTNS_;qjkxbmwvz:QJKXBMWVZ"};
char key[1000005];//开大点比较保险
int search(char s)//查找是否出现过
{
for(int i=0;x[i]!=0;++i)
{
if(x[i]==s)//找到就返回下标
{
return i;
}
}
return -1;//否则返回一个标记
}
void solve()
{
int len=strlen(key);int tp;
for(int i=0;i<len;++i)
{
tp=search(key[i]);
if(tp!=-1)//存在的话,改变值,否则不操作
{
key[i]=y[tp];
}
}
printf("%s\n",key);//输出字符串
}
int main()
{
while(gets(key))
{
solve();//调用函数
}
return 0;
}