2019广联达校招笔试题-字符串替换

题目描述

将给定的数转换为字符串,原则如下:1对应a,2对应b,…,26对应z。

  • 示例

输入
12258
输出
“abbeh”,”aveh”,”abyh”,”lbeh”,”lyh”
编写函数给出可以转换的字符串的个数。

题目思路

题目仅仅要求给出种类的数,那么我们可以具体的来分析
1. 当字符串为空串,返回0
2. 当字符串长度为1,返回1
3. 当字符串长度为2,这个时候判断这个字符串是不是大于26,如果大于26,那么只能转换成一个字符串s[0]+s[1],如果小于等于26的话,那么可以转换为s[0]+s[1]和s[01]两种字符串。

基于上面的递归思想,可以获得下面的目标函数

//计算子串的个数
int cnt(string s) {
    if (s.size() == 0)
        return 0;
    else if (s.size() == 1)
        return 1;
    else if (s.size() == 2) {
        if (stoi(s) <= 26)
            return 2;
        else
            return 1;
    }else {
        if (stoi(s.substr(0, 2)) <= 26)
            return 2 + cnt(s.substr(2));
        else
            return cnt(s.substr(1));
    }
}

如果让我们输出具体的子串,同样也是递归的思想,设置一个指针,当指针指向了最后元素的时候输出对应的字符串,这里应该注意使用begin+2的时候需要先判断会不会数组越界,防止错误发生。

//获取具体的子串
void getSubStr(string s,string res,int begin) { if (begin == s.size()) { cout << res<< endl;
        return;
    }

    if (begin + 2 <= s.size()) { if (stoi(s.substr(begin, 2)) <= 26) { getSubStr(s, res + getValue(s.substr(begin, 2)), begin + 2);
            getSubStr(s, res + getValue(s.substr(begin, 1)), begin + 1);
        }
        else
            getSubStr(s, res + getValue(s.substr(begin, 1)), begin + 1);
    }
    else
        getSubStr(s, res + getValue(s.substr(begin, 1)), begin + 1);

}

参考代码

#include <iostream>
#include <string>
#include <algorithm>
//#include <map>
//#include <stack>
using namespace std;

char getValue(string s) {
    int num = stoi(s);
    char res = 96 + num;
    return res;
}

//计算子串的个数
int cnt(string s) {
    if (s.size() == 0)
        return 0;
    else if (s.size() == 1)
        return 1;
    else if (s.size() == 2) {
        if (stoi(s) <= 26)
            return 2;
        else
            return 1;
    }else {
        if (stoi(s.substr(0, 2)) <= 26)
            return 2 + cnt(s.substr(2));
        else
            return cnt(s.substr(1));
    }
}

//获取具体的子串
void getSubStr(string s,string res,int begin) {
    if (begin == s.size()) {
        cout << res<< endl;
        return;
    }

    if (begin + 2 <= s.size()) {
        if (stoi(s.substr(begin, 2)) <= 26) {
            getSubStr(s, res + getValue(s.substr(begin, 2)), begin + 2);
            getSubStr(s, res + getValue(s.substr(begin, 1)), begin + 1);
        }
        else
            getSubStr(s, res + getValue(s.substr(begin, 1)), begin + 1);
    }
    else
        getSubStr(s, res + getValue(s.substr(begin, 1)), begin + 1);

}

int main() {
    string s = "12258";
    cout << cnt(s) << endl;
    getSubStr(s, "", 0);
    return 0;
}

  • 输出结果为‘’

lyh
lbeh
aveh
abyh
abbeh

点赞