小米服务端岗位编程题第三题代码

我们来做一个简单的密码破译游戏。破译的规则很简单,将数字转换为字母,1转化为a,2转化为b,依此类推,26转化为z。现在输入的密码是一串数字,输出的破译结果是该数字串通过转换规则所能产生的所有字符串。

输入:
1
12
123
输出:

a
ab l
abc aw lc

这题是leetcode 91.Decode Ways原题的改进版,原题只要输出编码数量,此题需要输出所有编码,代码如下:

    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    const int LOW = 1, HIGH = 26;
    vector> dp;
    void decode(string s)
    {
        vector res;
        int ls = s.size();
        if (ls == 0) return;
        for (int i = 0; i < ls; i++)
        {
            char ch1 = '0', ch2 = '0';
            int d = s[i] - '0';
            if (d >= LOW && d <= HIGH)
            {
                ch1 = 'a' + d - 1;
            }
            if (i > 0 && s[i-1] != '0')
            {
                d += (s[i-1] - '0')*10;
                if (d >= LOW && d <= HIGH)
                {
                    ch2 = 'a' + d - 1;
                }
            }
            if (ch1 != '0')
            {
                if (i > 0)
                {
                    vector t = dp[i-1];
                    for (auto &str : t)
                    {
                        string s1 = str + ch1;
                        dp[i].push_back(s1);
                    }
                }
                else
                {
                    string s1; s1.push_back(ch1);
                    dp[i].push_back(s1);
                }
            }
            if (ch2 != '0')
            {
                if (i > 1)
                {
                    vector t = dp[i-2];
                    for (auto &str : t)
                    {
                        string s1 = str + ch2;
                        dp[i].push_back(s1);
                    }
                }
                else
                {
                    string s1; s1.push_back(ch2);
                    dp[i].push_back(s1);
                }
            }
        }
    }
    int main()
    {
        string s;
        while (cin >> s)
        {
            dp.clear();
            dp.resize(s.size() + 1);
            decode(s);
            vector res = dp[s.size() - 1];
            for (int i = 0; i < res.size(); i++)
                i == res.size() - 1 ? cout << res[i] << endl : cout << res[i] << " ";
        }
        return 0;
    }
#小米##C++工程师#
全部评论
//服务端第三题,ac #include<iostream> #include<string> #include<vector> using namespace std; void getResult(string& temp, vector<string>& r, string& tempIn, int p) { if (p >= temp.size()) { r.push_back(tempIn); return; } tempIn.push_back(temp[p] - '0' - 1+ 'a'); getResult(temp, r, tempIn, p + 1); tempIn.pop_back(); if (temp.size()-p <= 1)return; if (temp[p] <= '2'&&temp[p + 1] <= '6' || temp[p] <= '1') { tempIn.push_back(((temp[p] - '0') * 10 + (temp[p + 1] - '0')) - 1 + 'a'); getResult(temp, r, tempIn,p + 2); tempIn.pop_back(); } } int main(void) { string temp, r, tempIn; vector<string> result; while (cin >> temp) { getResult(temp, result, tempIn, 0); for (int i = 0; i < result.size(); ++i) { for(int j=0;j<result[i].size();++j) printf("%c",result[i][j]); if (i == result.size() - 1)printf("\n"); else printf(" "); } r.clear(); tempIn.clear(); result.clear(); temp.clear(); } return 0; }
点赞 回复 分享
发布于 2017-09-18 21:51
我1个小时就AC了这一道题。。。
点赞 回复 分享
发布于 2017-09-18 21:54
欢迎交流,这个题我是考完之后做的,不知道对不对。
点赞 回复 分享
发布于 2017-09-18 21:33
AC了的同学,你们全部是用的 while(cin>>str) 这种方式,一直读取然后输出吗?? 程序里我就写的 cin>>str  ,是不是赛码网oj系统不会自动重新运行程序??
点赞 回复 分享
发布于 2017-09-18 21:58
这题跟ip address略像
点赞 回复 分享
发布于 2017-09-19 01:59

相关推荐

斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务