題目描述
按照手機(jī)鍵盤輸入字母的方式古劲,計(jì)算所花費(fèi)的時(shí)間 如:a,b,c都在“1”鍵上斥赋,輸入a只需要按一次,輸入c需要連續(xù)按三次产艾。 如果連續(xù)兩個(gè)字符不在同一個(gè)按鍵上疤剑,則可直接按,如:ad需要按兩下闷堡,kz需要按6下 如果連續(xù)兩字符在同一個(gè)按鍵上隘膘,則兩個(gè)按鍵之間需要等一段時(shí)間,如ac杠览,在按了a之后弯菊,需要等一會(huì)兒才能按c。 現(xiàn)在假設(shè)每按一次需要花費(fèi)一個(gè)時(shí)間段踱阿,等待時(shí)間需要花費(fèi)兩個(gè)時(shí)間段管钳。 現(xiàn)在給出一串字符,需要計(jì)算出它所需要花費(fèi)的時(shí)間软舌。
輸入描述:
一個(gè)長(zhǎng)度不大于100的字符串才漆,其中只有手機(jī)按鍵上有的小寫字母
輸出描述:
輸入可能包括多組數(shù)據(jù),對(duì)于每組數(shù)據(jù)佛点,輸出按出Input所給字符串所需要的時(shí)間
示例1
輸入
bob
www
輸出
7
7
思路
手機(jī)鍵盤的結(jié)構(gòu)為:abc, def, ghi, jkl, mno, pqrs, tuv, wxyz
題目的要求歸納為兩點(diǎn):
- 連續(xù)兩次不在一個(gè)按鍵可以直接按醇滥;
- 連續(xù)兩次同一個(gè)按鍵需要等待2個(gè)時(shí)間段
則在不考慮等待時(shí)間的情況下a~z每個(gè)小寫字母的按鍵次數(shù)分別為
times[26] = {1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4}
接下來(lái)考察什么情況會(huì)出現(xiàn)等待時(shí)間,連續(xù)按相同按鍵時(shí)即會(huì)出現(xiàn)等待時(shí)間超营,于是問(wèn)題變成了怎么判斷是否連續(xù)按相同按鍵鸳玩,于是將相同按鍵上的字母用相同的數(shù)字表示,即a~z對(duì)應(yīng)
same[26] = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8}
對(duì)于輸入的字符串演闭,每個(gè)字符減去 'a' 的 ASCII 碼即對(duì)應(yīng)上了上述數(shù)組
解法
#include<stdio.h>
#include<string.h>
int main(){
char str[100]; //待輸入的字符串
int res = 0; //輸出的結(jié)果
int times[26] = {1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4}; //每個(gè)字母的按鍵次數(shù)
int same[26] = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8}; //同一個(gè)按鍵上的字母數(shù)字相同
while(gets(str) != NULL){
for(int i = 0; i < strlen(str); i++){
res += times[str[i] - 'a'];
if(i > 0)
if(same[str[i] - 'a'] - same[str[i -1] - 'a'] == 0) //從第二個(gè)字母開始怀喉,如果和前一個(gè)是相同按鍵,加2時(shí)間
res += 2;
}
printf("%d\n", res);
}
return 0;
}