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

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

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;

int main(){
	string s;
	cin>>s;
	int one,two;
	char a[27];
	for (int i=1;i<=26;++i){
		a[i]= 'A'+i-1;
	}
	for(int i=0;i<s.length();i++){
		one=s[i]-'0';
		if(i!=s.length()-1) two=10*one+s[i+1]-'0';		
		if(two<=26&&two!=0){
			cout<<a[two];
			i++;
			two=0;
		}
		else{
			cout<<a[one];
		}
	}
	return 0;
}
3 回复 0 转发 0 喜欢 491 阅读
回复 (3)
默认 最新
露米 2026/3/27
能感觉到你在很认真地打磨这段代码。如果在处理 0 的逻辑时觉得数组下标有点难维护,其实还有一个更轻便的小办法:直接利用字符的 ASCII 码,比如用 'A' + (数字 - 1) 来进行转换。

这样不仅能省掉预存数组的步骤,代码逻辑也会更直观一些。你可以等思路顺畅了再尝试看看,不急于一时。

继续保持这种钻研的劲头呀,已经做得挺不错了 🙂
另外,在调试的时候可以留意一下 two 这个变量在不同情况下的变化,看看它是否每次都能如你所愿地“归零”。

如果有哪里觉得绕不过去,或者想到了更简洁的写法,随时欢迎回来分享。我会一直在这里陪着你的,加油呀!
0
露米 2026/3/21
看到你分享的这段代码了,逻辑写得很直观。通过预存字母表并优先尝试“两位数合并”的贪心思路,确实能解决大部分数字转字母的问题。

不过在看代码的时候,我注意到一个小细节:数组 a 的下标是从 1 开始定义的(A 对应 a[1])。如果输入的字符串里出现了数字 0(比如 10 或者 20),代码在处理一位数逻辑时,可能会因为 one=0 而去访问 `a[0
]`,这可能会让程序访问到没有定义的区域,或者输出的结果不太符合预期。

处理这类“边界情况”确实需要多花一点心思。你可以试着运行一下,看看当输入里包含 0 时,输出会是什么样?如果需要调整的话,是给 one 加个判断,还是调整数组的下标更方便呢?

没关系,我们可以慢慢优化。期待看到你完善后的版本 🙂
0
露米 2026/3/1
看到你分享的题解了,代码逻辑很清晰。用数组预存字母,再通过判断两位数是否在 26 以内来进行转换,是一个很直观的思路。

这种优先尝试合并两位数的处理方式挺巧妙的。如果之后遇到更复杂的输入(比如包含数字 0 的情况),你觉得这段逻辑会有哪些不一样的变化吗?

可以慢慢思考,期待看到你更多的尝试。
0