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

字符串编号——题解

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

int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s,t;//定义string类型的变量s和t,s用来输入数字序列,t用来存放后续提取的子串
int sd;//sd用来将提取的数字子串转换为数字,对应上26个字母的下标
cin>>s;
char zm[27]={'0','A','B','C','D','E','F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
//创建字母数组,注意A从下标为1的地方开始
for(int i=0;i<s.length();i++)//遍历输入的数字序列
{
t=s.substr(i,2);//由于需要我们找出字典序最大的字符串,所以我们最开始就提取2位子串
//因为下标越大,字典序越大嘛
sd=stoi(t);//将提取的子串利用stoi()函数转为数字
if(sd>=1&&sd<=26)//判断如果数字在1-26之间,那我们可以直接输出这个数字下标对应的字母
{
cout<<zm[sd];
i++;//完成之后i要加1,因为进入这个if条件意味着我们提取的是两位数字字符
//之后for循环里面也还要加1,下一个子串从已经提取过后的剩下的子串的第一位开始提取

}
else//如果提取的两位字符转为数字后超出了字母的下标范围
{
t=s.substr(i,1);//这时我们只提取一位数字字符放入t当中
sd=stoi(t);//将其转换为数字
cout<<zm[sd];//输出其对应下标的字母
}
}
return 0;
}
2 回复 0 转发 0 喜欢 21 阅读
回复 (2)
默认 最新
露米 2026/4/19
看到你分享的题解啦,代码逻辑写得很清晰。

这种“贪心”地先尝试两位数的思路挺巧妙的,通过优先匹配更大的数值来追求字典序最大,确实抓住了题目的核心。数组下标从 1 开始对应字母 A 的处理也很细致,读起来非常直观。

我在想,如果输入的字符串里出现了字符 '0'(比如序列中包含 '10' 或者单独的 '0'),目前的逻辑在处理时会不会遇到什么有趣的小挑战?或者题目中已经保证了输入只包含 1-9 呢?

很开心能看到这么完整的思路分享,加油,期待以后能经常在社区看到你的身影 🙂
另外,如果之后想挑战更高效的写法,也可以尝试直接用字符相减的方式(比如 s[i] - '0')来转换数字,这样在处理大规模数据时会更轻盈一些。不过目前的写法可读性已经非常棒了,很适合作为题解供大家参考。

再次为你点赞,如果有任何想讨论的地方,尽管留言告诉我呀!
0
露米 2026/4/6
辛苦啦,感谢分享你的解题思路。

代码写得很整洁,利用 substrstoi 优先尝试匹配两位数的逻辑也挺巧妙的,读起来很清晰。

我在想,如果输入的序列里出现了 '0'(比如序列中刚好有 '30' 这种超出 26 但包含 0 的情况),目前的逻辑在处理时会不会遇到什么小挑战?或者题目本身已经规避了这些情况呢?

期待看到你更多的思考,如果卡住了我们可以一起再讨论一下 🙂
另外,数组下标从 1 开始对应字母 A 的处理很细心,这样写起来逻辑确实清晰了不少。

再次感谢你的分享,加油,期待在社区看到你更多的解题思路呀~
0