首页 > 试题广场 >

手机键盘

[编程题]手机键盘
  • 热度指数:31570 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在“1”键上,输入a只需要按一次,输入c需要连续按三次。 如果连续两个字符不在同一个按键上,则可直接按,如:ad需要按两下,kz需要按6下 如果连续两字符在同一个按键上,则两个按键之间需要等一段时间,如ac,在按了a之后,需要等一会儿才能按c。 现在假设每按一次需要花费一个时间段,等待时间需要花费两个时间段。 现在给出一串字符,需要计算出它所需要花费的时间。

输入描述:
一个长度不大于100的字符串,其中只有手机按键上有的小写字母


输出描述:
输入可能包括多组数据,对于每组数据,输出按出Input所给字符串所需要的时间
示例1

输入

bob
www

输出

7
7
type_cost = 1
wait_cost = 2
alpha_map = {
    'a': 'abc',
    'b': 'abc',
    'c': 'abc',
    'd': 'def',
    'e': 'def',
    'f': 'def',
    'g': 'ghi',
    'h': 'ghi',
    'i': 'ghi',
    'j': 'jkl',
    'k': 'jkl',
    'l': 'jkl',
    'm': 'mno',
    'n': 'mno',
    'o': 'mno',
    'p': 'pqrs',
    'q': 'pqrs',
    'r': 'pqrs',
    's': 'pqrs',
    't': 'tuv',
    'u': 'tuv',
    'v': 'tuv',
    'w': 'wxyz',
    'x': 'wxyz',
    'y': 'wxyz',
    'z': 'wxyz'
}

while True:
    try:
        type_str = input()

        sum_cost = 0
        for idx, alpha in enumerate(type_str):
            # 输入第一个字母
            if idx == 0:
                sum_cost += alpha_map[alpha].find(alpha) + 1
            else:
                before_alpha = type_str[idx-1]
                # 输入的字母与前一个字母在同一格子
                if alpha_map[before_alpha] == alpha_map[alpha]:
                    sum_cost += wait_cost

                sum_cost += alpha_map[alpha].find(alpha) + 1

        print(sum_cost)
    except:
        break

发表于 2021-03-09 20:35:36 回复(0)
while True:
    try:
        inp=list(input().strip())
        list1=[['a','b','c'],['d','e','f'],['g','h','i'],
               ['j','k','l'],['m','n','o'],['p','q','r','s'],
               ['t','u','v'],['w','x','y','z']]
        lenth=len(inp)
        lenth2=len(list1)
        index=''
        time=0
        for i in range(lenth):
            index1=inp[i]
            for j in range(lenth2):
                if index1 in list1[j]:
                    if index in list1[j]:
                        time+=2
                        time+=list1[j].index(index1)+1
                    else:
                        time+=list1[j].index(index1)+1
                    break
            index=index1
        print(time)
    except:
        break
发表于 2019-08-19 08:49:17 回复(0)
#有点蠢的方法
a1=['a','d','g','j','m','p','t','w']
b2=['b','e','h','k','n','q','u','x']
c3=['c','f','i','l','o','r','v','y']
d4=['s','z']
k1=['a','b','c']
k2=['d','e','f']
k3=['g','h','i']
k4=['j','k','l']
k5=['m','n','o']
k6=['p','q','r','s']
k7=['t','u','v']
k8=['w','x','y','z']
a=list(input())
c=0 for i in a: if i in a1:
        c+=1  if i in b2:
        c+=2  if i in c3:
        c+=3  if i in d4:
        c+=4 for j in range(len(a)-1): if a[j] in k1 and a[j+1] in k1:
        c+=2  if a[j] in k2 and a[j + 1] in k2:
        c += 2  if a[j] in k3 and a[j+1] in k3:
        c+=2  if a[j] in k4 and a[j + 1] in k4:
        c += 2  if a[j] in k5 and a[j+1] in k5:
        c+=2  if a[j] in k6 and a[j + 1] in k6:
        c += 2  if a[j] in k7 and a[j+1] in k7:
        c+=2  if a[j] in k8 and a[j + 1] in k8:
        c += 2 print(c)
发表于 2019-08-16 15:27:05 回复(1)
#把键盘贴出来,一个记录结果,一个记录上一个键盘位的下标(初始为-1)
#如果在键盘里找到了该字符,则结果加上该字符在该键的下标+1,
#如果该字符所在键下标和上一个相等,结果+2,记录当前键下标
while True:
    try:
        keyboard = ['abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
        string = input()
        result,lastIndex = 0,-1
        for i in range(len(string)):
            for j in range(len(keyboard)):
                if keyboard[j].find(string[i]) != -1:
                    result += keyboard[j].find(string[i]) + 1
                    if lastIndex == j:          #如果和上一个字符在同一个键盘位+2
                        result += 2
                    lastIndex = j
                    break
        print(result)
    except Exception:
        break

编辑于 2018-10-11 23:39:58 回复(0)
 
l=['abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']
s=input()
time=0 t=[] for i in range(len(s)):  for j in range(8):  if s[i] in l[j]:
       time+=l[j].find(s[i])+1  #字符串的find方法可以返回元素在字符串中的索引  t.append(j) 
        #将每个字母所在键的数字存在列表t中 #判断列表t中连续的两个元素是否相同
for k in range(1,len(t)):  if t[k]==t[k-1]:
       time+=2 print(time)

编辑于 2018-05-03 09:48:33 回复(0)

python solution

思路,一个字母一个字母的遍历字符串,不仅要考虑当前的字母需要按几下,还需要考虑是不是和上一个字母在同一个数字键上,所以还要有一个中间变量来保存上一个字母是在哪个键上,和当前字母做对比

def getChar(char):
    if char in "adgjmptw":
        return (1, "adgjmptw".index(char))
    elif char in "behknqux":
        return (2, "behknqux".index(char))
    elif char in "cfilorvy":
        return (3, "cfilorvy".index(char))
    elif char in "00000s0z":
        return (4, "00000s0z".index(char))

import sys

for i in sys.stdin.readlines():
    lastChar = None
    res = 0
    for char in i.strip():

        curNum, tmpChar = getChar(char)
        if tmpChar == lastChar:
            res += 2
        lastChar = tmpChar
        res+=curNum
    print(res)
发表于 2017-11-10 17:17:03 回复(0)