最稳妥直接的方法是用 std::to_string 转字符串后双指针比较;负数因带负号直接失败,无需额外判断;实操建议先检查 x。

用 std::to_string 转成字符串再双指针比较最稳妥
直接转字符串是 C++ 里最直观、不易出错的方式,尤其适合处理负数和边界情况。负数一定不是回文(带负号),std::to_string 会原样保留符号,一比较就失败,不用额外判断。
实操建议:
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 先检查
x ,直接返回 <code>false(可选,因为转串后首字符是'-',双指针自然不等) - 用
auto s = std::to_string(x)得到字符串,避免手动处理十进制位数和溢出 - 用两个索引
i = 0,j = s.size() - 1向中间收拢,遇到s[i] != s[j]就返回false - 注意:不要用
s.compare()或std::reverse创建新串,徒增空间开销
bool isPalindrome(int x) {
if (x < 0) return false;
auto s = std::to_string(x);
int i = 0, j = s.size() - 1;
while (i < j) {
if (s[i++] != s[j--]) return false;
}
return true;
}反转整数再比较要小心溢出和末尾零
数学法看似高效,但实际在 C++ 里风险更高:反转过程中可能溢出(比如 x = 1000000009 反转得 9000000001,超出 int 范围),而且像 10、200 这类以 0 结尾的数,反转后变成 1、2,直接比较会误判。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 必须用
long long存反转结果,否则int反转时未定义行为(UB) - 提前排除
x % 10 == 0 && x != 0的情况(个位为 0 且非零数必不回文) - 反转只做一半:当
reversed >= x时停止,然后比对reversed == x || reversed / 10 == x(处理奇数位) - 别忘了负数直接返回
false
std::to_string 在 C++11 及以上可用,无需第三方依赖
有人担心 std::to_string 效率低或兼容性差,其实它在所有主流编译器(GCC 4.8+、Clang 3.3+、MSVC 2013+)都已稳定支持。相比手写除 10 取余逻辑,它更少出错、可读性强,且现代标准库实现通常做了优化。
注意点:
- 如果项目强制 C++98,那就只能手写反转或用
std::stringstream,但后者更重 - 不推荐用
itoa:它不是标准函数,Windows 和 Linux 行为不一致,且线程不安全 - 对性能极端敏感的嵌入式场景才需避开字符串——但此时通常也不会用
int存大数,回文判断本身意义有限
负数、0、个位数这些边界值最容易漏判
很多实现只关注正数中间逻辑,结果栽在边界上。比如把 0 当作需要反转的数,或忘记负数带符号,或认为 5 不是回文(其实是)。
验证时至少覆盖这几组输入:
-
0→true -
-121→false(字符串是"-121") -
10→false(字符串"10"≠"01") -
1221→true -
12321→true
真正麻烦的是想兼顾“无额外空间”和“无字符串”的需求——那得反复取模、小心溢出、处理位数奇偶,反而容易引入 bug。日常开发中,可读性和正确性优先于几纳秒的差异。

















