题解 | #手机键盘#

手机键盘

https://www.nowcoder.com/practice/20082c12f1ec43b29cd27c805cd476cd

#include<iostream>

struct Key
{
    int same;//判断字符是否在同一按键上
    int rank;//通过字符排列的位置定义需要按几次
    Key(int x, int y)
        : same(x), rank(y)
    {
    }
};
//初始化26个英文字母在按键上的位置和排列次序,同一个按键same变量相同,rank表示按键次数
Key k[26] ={{1,1}, {1,2}, {1,3},{2,1},{2,2},{2,3},{3,1},{3,2},{3,3},{4,1},{4,2},{4,3},
    {5,1},{5,2},{5,3},{6,1},{6,2},{6,3},{6,4},{7,1},{7,2},{7,3},{8,1},{8,2},{8,3},{8,4}};

int PrintTime(char pre, char post)//通过pre和post判断是否在同一个按键上
{
    if(pre == '0') return k[post-'a'].rank;//每个字符串的第一个字符单独处理
    /*
    *这里面包含了两种情况:
    *一是同一个按键不同字母
    *二是同一个按键相同字母
    */
    if(k[pre-'a'].same == k[post-'a'].same)
    {
        return 2+k[post-'a'].rank;
    }else{
        return k[post-'a'].rank;//如果是不同按键,直接返回rank次数
    }


}

int main()
{
    std::string s;
    int sum;
    while(std::cin >> s)
    {
        sum = 0;
        sum += PrintTime('0', s[0]);
        char pre = s[0];
        for(int i = 1;i < s.size();i++)
        {
            sum += PrintTime(pre, s[i]);
            pre = s[i];
        }
        std::cout << sum << std::endl;
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务