不安全,因反转可能溢出;推荐只反转后半段并与前半段比较,时间O(log n)、空间O(1),且天然规避溢出风险。

直接反转整数再比较是否安全?
C++里最直观的思路是把数字转成字符串或逐位反转,再比对原值。但要注意:int 反转可能溢出——比如 2147483647 反转后是 7463847412,远超 INT_MAX,触发未定义行为。所以不能无脑用 long long 临时存,得先判断是否会溢出,或者换更稳妥的方式。
- 反转时每步都检查:若当前结果 >
INT_MAX / 10,或等于且下一位 >7(INT_MAX末位),就提前返回 false - 更推荐避免反转:只反转后半段,和前半段比(见下一条)
- 负数直接返回 false(
-121不是回文,符号破坏对称性)
只反转后半段,避免溢出和额外空间
这个方法时间复杂度 O(log n),空间 O(1),且天然规避溢出风险——因为只处理原数的后半位,数值不会超过原数本身。
- 先排除
x < 0和x % 10 == 0 && x != 0(如10、100) - 用
reversed = 0累加后半位:reversed = reversed * 10 + x % 10,同时x /= 10 - 循环条件是
x > reversed(奇数位时,最后x == reversed / 10才算匹配) - 示例:x =
1221→ x=12, reversed=12 → 相等;x =12321→ x=12, reversed=123 → 此时x == reversed / 10(即12 == 123 / 10)
用字符串转换是否可行?
可行,但有隐含成本:分配堆内存(std::string 构造)、字符遍历、额外空间 O(log n)。在嵌入式或性能敏感场景不推荐。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 写法简单:
std::string s = std::to_string(x),然后双指针扫s[i] != s[s.size()-1-i] - 注意:
std::to_string对负数会带 '-',所以-121变成"-121",首尾一比就错,但逻辑上已由负数判断前置拦截 - 如果编译器不支持 C++11,
std::to_string不可用,得用sprintf或std::stringstream
边界情况容易漏哪些?
回文数判断真正卡人的不是算法,而是边界细节:
立即学习“C++免费学习笔记(深入)”;
-
0是回文数,必须单独允许(x == 0不能被x % 10 == 0误判) - 个位数(
1~9)全是回文,但用后半段反转法时,初始x > reversed不成立(reversed==0),需确保循环至少执行一次或补判 -
INT_MIN(-2147483648)无法取正,但负数直接 return false,所以不用转正 - 用
long long存反转结果看似保险,但题目若限定输入为int,仍应优先体现对溢出的防御意识
实际写的时候,别急着敲完整函数,先手推几个例子:0、7、10、121、1221、-121、100 —— 每个都走一遍逻辑,比看十遍代码管用。

















