返回题解分享
讨论 / 题解分享/ 帖子详情

字符串编号(编程题) - 题解

#include <bits/stdc++.h>
using namespace std;

int main()
{
    map<int, string> dictionary{{26,"Z"},{25,"Y"},{24,"X"},{23,"W"},{22,"V"},{21,"U"},{20,"T"},{19,"S"},{18,"R"},{17,"Q"},{16,"P"},{15,"O"},{14,"N"},{13,"M"},{12,"L"},{11,"K"},{10,"J"},{9,"I"},{8,"H"},{7,"G"},{6,"F"},{5,"E"},{4,"D"},{3,"C"},{2,"B"},{1,"A"}};  //真是打打又表表啊
    string str;
    getline(cin, str);
    int temp;
    for(int i=0; i<str.size(); i++)
    {
        if(str.substr(i, 2)>"26")
        {
            temp=stoi(str.substr(i,1));
            cout << dictionary[temp];
        }
        else
        {
            temp=stoi(str.substr(i,2));
            cout << dictionary[temp];
            if(temp>9)
            {
                i++;
            }
        }
    }
    return 0;
}
2 回复 0 转发 0 喜欢 24 阅读
回复 (2)
默认 最新
露米 6 天前
补充一个小发现,希望能帮你把代码逻辑打磨得更稳健。

在这一行 if(str.substr(i, 2) > "26") 中,C++ 其实是在按照“字典序”比较字符串。这就像在字典里查单词一样,字符串 "3" 的首字母比 "2" 大,所以程序会认为 "3" 是大于 "26" 的。这可能会导致一些本该按一位数处理的情况,不小心跑到了错误的逻辑分支里。

如果尝试先把截取的字符串用 `stoi
转成整数后再进行数值大小的判断,逻辑就会更加严谨啦。

另外,当 i 运行到字符串最后一个字符时,substr(i, 2) 只能取到一个字符,此时的字典序比较可能会产生意想不到的结果,这也是个值得关注的小细节。

这种一点点打磨代码的过程其实很有成就感,你可以试着调整看看。如果修改过程中遇到什么疑问,随时在这里留言,我会陪你一起思考的 🙂
0
露米 2026/3/11
看到这一长串手动打表,能感觉到楼主写代码时的认真呢,辛苦啦。

代码逻辑很清晰,用 substr 配合 stoi 来处理变长数字是一个很直观的思路。如果以后想让代码更简洁一点,也可以尝试利用字符编码的小特性(比如 'A' + temp - 1)来直接转换,这样就不用辛苦手打 map 啦。

不过现在的写法读起来也非常清楚。在写这段逻辑的时候,有没有遇到什么特别棘手的边界情况呀?🙂
比如处理到字符串末尾,只剩下一个字符时,substr(i, 2) 的取值范围可能会需要稍微留意一下。如果之后想到了更稳妥的处理方式,也欢迎随时回来补充呀。

加油,期待看到你更多的进步 🙂
0