当前位置: 代码迷 >> 综合 >> 清华大学--手机键盘
  详细解决方案

清华大学--手机键盘

热度:86   发布时间:2024-01-06 13:12:04.0

题目描述
按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在“1”键上,输入a只需要按一次,输入c需要连续按三次。 如果连续两个字符不在同一个按键上,则可直接按,如:ad需要按两下,kz需要按6下 如果连续两字符在同一个按键上,则两个按键之间需要等一段时间,如ac,在按了a之后,需要等一会儿才能按c。 现在假设每按一次需要花费一个时间段,等待时间需要花费两个时间段。 现在给出一串字符,需要计算出它所需要花费的时间。
输入描述:
一个长度不大于100的字符串,其中只有手机按键上有的小写字母
输出描述:
输入可能包括多组数据,对于每组数据,输出按出Input所给字符串所需要的时间
示例1
输入

bob
www
输出

7
7


分析
刚看到这道题时,死在了对手机九键的认识上,我误以为手机九键是三个三个字母在一起的那种,然而其实并非如此。唉,天天见天天摸,却没有注意到她的模样。。。
编程,真是从生活中来,到生活中去呀。
认识到拼音九键是下图这样的,
这里写图片描述


然后就开始写代码,遍历判断,然而,写完调试完,不出意料的超时了就。。
错误代码如下:

#include <stdio.h>
#include <math.h>
int solve(char s[101]){         //判断按出字符串需要的时间int i,t=0;for(i=0;s[i]!='\0';i++){    //遍历字符串中的每一个字符if((i>0)&&(fabs(s[i]-s[i-1])<=2)){    //如果相邻字符在同一个手机按键上t+=2;}//用ascii码判断遍历到的每一个字符是按键上的第几个//注意手机九键的排序方式if(s[i]<='o'){t+=((s[i]-'a')%3+1);}else if(s[i]>='p'&&s[i]<='s'){t+=((s[i]-'p')%4+1);}else if(s[i]>='t'&&s[i]<='v'){t+=((s[i]-'t')%3+1);}else if(s[i]>='w'&&s[i]<='z'){t+=((s[i]-'w')%4+1);}}return t;
}int main(){char s[101];while(scanf("%s",s)){printf("%d\n",solve(s));}return 0;
}

清华就是清华,不可能出送分题的,看来是需要优化了,

通过的代码:

#include <stdio.h>
/*九键布局 abc def ghi jkl mno pqrs tuv wxyz*/char getkey(char a){    //确定字符串中的每一个字符究竟在哪个键上if(a>='a'&&a<='c') return 'a';if(a>='d'&&a<='f') return 'd';if(a>='g'&&a<='i') return 'g';if(a>='j'&&a<='l') return 'j';if(a>='m'&&a<='o') return 'm';if(a>='p'&&a<='s') return 'p';if(a>='t'&&a<='v') return 't';if(a>='w'&&a<='z') return 'w';return '\0';}int main(){char s[101];while(scanf("%s",s)!=EOF){int t=0;int i;//遍历s中的每一个字符for(i=0;s[i]!='\0';i++){char c=getkey(s[i]);//当相邻两次按同一个键时if(i>0&&(getkey(s[i])==getkey(s[i-1]))){t+=2;}t+=(s[i]-c+1);}printf("%d\n",t);}return 0;
}

注意的一点,在定义getkey函数时,一系列的if语句之后,需要返回一个‘\0’或别的任意字符,否则,编译容易不通过,系统会觉得如果所有的if都不满足的话就不知所措了吧。。。。