1. 数字反转问题的深度解析
最近在刷算法题时遇到了P1553数字反转(升级版)这道题目,感觉它很好地考察了字符串处理的基本功。这道题看似简单,但实际处理起来有不少细节需要注意。下面我将详细分享我的解题思路和实现过程,希望能帮助到同样在学习算法的朋友。
1.1 题目理解与需求分析
题目要求我们对给定的数字进行反转处理,这个数字可能是整数、小数、分数或百分数。每种情况的反转规则有所不同:
- 整数反转:将所有数位对调,如1234→4321
- 小数反转:分别反转整数部分和小数部分,但不交换两部分位置,如123.456→321.654
- 分数反转:分别反转分子和分母,但不交换分子分母位置,如123/456→321/654
- 百分数反转:只反转数字部分,百分号位置不变,如123%→321%
此外还有一些特殊要求:
- 反转后的整数不能有前导零(除非原数为0)
- 反转后的小数部分末尾不能有多余的零(除非小数部分全为0)
- 分数不需要约分
- 题目保证输入都是正数
1.2 核心算法设计思路
解决这个问题的关键在于字符串处理。我采用了以下策略:
- 分类处理:首先判断输入字符串的类型(整数、小数、分数或百分数)
- 分段反转:根据不同类型,将字符串分割成需要反转的部分
- 零处理:对反转后的结果进行前导零或后缀零的处理
- 结果拼接:将处理后的各部分重新组合成最终结果
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 具体实现与代码解析
2.1 基础反转函数实现
首先实现一个基础的字符串反转函数,这个函数会处理整数部分的反转并去除前导零:
csharp复制string ReverseIntegerPart(string s)
{
// 先反转整个字符串
char[] charArray = s.ToCharArray();
Array.Reverse(charArray);
string reversed = new string(charArray);
// 去除前导零
int firstNonZero = 0;
while(firstNonZero < reversed.Length && revers
