原题解答
本次的题目如下所示(原题出处:NOC)
一般的手机的键盘是这样的:
要按出英文字母就必须要按数字键多下。例如要按出 x 就得按 9 两下,第一下会出 w,而第二下会把 w 变成 x。0 键按一下会出一个空格。
你的任务是读取若干句只包含英文小写字母和空格的句子,求出要在手机上打出这个句子至少需要按多少下键盘。
输入格式
一行句子,只包含英文小写字母和空格,且不超过 200 个字符。
输出格式
一行一个整数,表示按键盘的总次数。
输入样例
i have a dream
输出 样例
23
本道题本身并不是很难,而且解题的方法也有多种,关键在于能不能读懂题目,有没有思路。这总键盘对于现在的孩子来说相对较为陌生,是诺基亚时代的手机输入方式。
我们先解释一下如何通过“i have a dream”得到23这个结果的。键盘上2到9折八个数字每个数字各对应3到4个字母,如果我们要键入第一个字母,只要按一下对应的数字键;键入第二个字母则要连续按两下这个数字键。也就是键入一个字母最多可能要按4下,比如字母s和字母z。以下是这句话中各个字母需要按键盘的次数:
i | h | a | v | e | a | d | r | e | a | m | |||
3 | 1 | 2 | 1 | 3 | 2 | 1 | 1 | 1 | 1 | 3 | 2 | 1 | 1 |
通过相加可以得到,总和为23。
下面我们看一下通过程序如何实现。
方法一:多分支结构 + 逻辑语句
我们将每个字母需要按键几下写到分支结构中,然后通过遍历字符串中的字符进行累加,其实很容易得到程序的代码:
s = input()
n = 0
for i in s:
if i == 'a' or i == 'd' or i == 'g' or i == 'j' or i == 'm' or i == 'p' or i == 't' or i == 'w' or i == ' ':
n += 1
elif i == 'b' or i == 'e' or i == 'h' or i == 'k' or i == 'n' or i == 'q' or i == 'u' or i == 'x':
n += 2
elif i == 'c' or i == 'f' or i == 'i' or i == 'l' or i == 'o' or i == 'r' or i == 'v' or i == 'y':
n += 3
elif i == 's' or i == 'z':
n += 4
print(n)
方法二:多分支结构 + 成员运算符
刚刚的代码确实解决了问题,但是如果相对来说代码较为零散,并且很容易写错。如果我们将需要按一下、按两下、按三下和按四下的字母分别放入四个序列中,可大幅度提高代码的可阅读性。我们看看如何书写:
s = input()
one = 'adgjmptw ' # 注意还有空格
two = 'behknqux'
three = 'cfilorvy'
four = 'sz'
n = 0
for i in s:
if i in one:
n += 1
elif i in two:
n += 2
elif i in three:
n += 3
elif i in four:
n += 4
print(n)
方法三:键值对匹配
除了上述的方法外,我们还可以利用字典类型对字母的按键次数进行匹配。此方法代码是所有解决方法中最简的,较繁琐的是字典的定义。
s = input()
alpha = {'a': 1, 'b': 2, 'c': 3,
'd': 1, 'e': 2, 'f': 3,
'g': 1, 'h': 2, 'i': 3,
'j': 1, 'k': 2, 'l': 3,
'm': 1, 'n': 2, 'o': 3,
'p': 1, 'q': 2, 'r': 3, 's': 4,
't': 1, 'u': 2, 'v': 3,
'w': 1, 'x': 2, 'y': 3, 'z': 4,
' ': 1
}
n = 0
for i in s:
n += alpha.get(i)
print(n)
本题拓展
本题考查的是字符统计问题,题目难度★
本类题型的特点是未涉及任何复杂的算法问题,想要做出来也非常容易。但是要将代码写到最优是需要动脑筋的,需要我们对Python的各种数据类型和运算符有较为熟练的掌握。
此类题型在竞赛,尤其是初赛的前两题中经常会出现。
我们看下面这一道题:
输入一句英文,统计各个字母在句子中出现的次数(不区分大小写,仅统计字母,不统计空格和标点符号等)。
输入格式:在一行中输入一句英文
输出格式:分多行输出,每行输出一个字母和出现的次数
输入样例:
This is my sister
输入样例:
T 2
H 1
I 3
S 4
M 1
Y 1
E 1
R 1
本题也不算难,但是要想做对了,是需要细心的。首先要考虑不区分大小写的问题,其次要考虑不统计标点符号和空格。这道题我们可以充分利用字典类型统计。
s = input()
d = {}
s = s.upper() # 全部转换为大写字母
for i in s:
if i.isalpha(): # 只统计字母,不是字母不统计
if i not in d:
d[i] = 1 # 字典中没有个数为1
else:
d[i] += 1 # 字典中已存在的个数+1
for k, v in d.items():
print(k, v)
大家可以自己思考本题还有其他什么思路解答。