std::to_string+双指针是实际最快的“极速版”,因其高度优化、无溢出风险、天然处理0和个位数;位运算法不成立,因回文定义在十进制序列而位运算操作二进制比特,二者本质不匹配。

std::to_string + 双指针是实际最快的“极速版”
别被“位运算”“数学优化”误导——现代编译器下,std::to_string(x) 对 int 转字符串已高度内联且无堆分配开销(小整数走 SSO),后续双指针遍历是纯 CPU 寄存器操作,比手写除 10 循环更稳更快。所谓“数学法省空间”,在 L1 cache 容纳整个字符串的前提下,根本没性能优势。
- 直接写
auto s = std::to_string(x),不用自己算位数、不处理负号、不担心溢出 - 循环用
for (int i = 0, j = s.size() - 1; i ,每次只读两个 char,分支预测友好 - 负数会自动失败:
std::to_string(-121)得"-121",首尾比较'-' != '1'立刻返回 false - 0 和个位数天然正确:
"0"、"7"进入循环时i >= j,直接跳过并返回 true
数学反转一半必须避开三个硬坑
想用纯数值法?可以,但不是“只要写 while(x > reversed) 就完事”。真实翻车点都在边界上,而且一错就漏掉 10、1001、0 这类典型用例。
-
x % 10 == 0 && x != 0必须放最前:否则10进入循环,最终x == 1、reversed == 1,误判为 true -
reversed必须声明为long long:即使输入是int,reversed * 10 + x % 10中的乘法可能先溢出(如reversed == 214748364时再乘 10 就超INT_MAX) - 终止条件只能是
while (x > reversed),不能写>=:否则1会进循环,reversed变成 1,x变成 0,最后0 == 1 || 0 == 1/10全 false
为什么没有“位运算法”或“二进制回文判定”
因为回文数定义在十进制数字序列上,而位运算操作的是二进制比特。比如 121 的十进制是回文,但二进制是 1111001,反转得 1001111 = 79,和 121 毫无关系。所有声称“用 &、^、移位加速”的方案,要么混淆了“回文串”,要么是标题党。
- 试图用
x & 1提取“最后一位”?那是最低位比特,不是十进制个位 - 用
x >> n想取“第一位”?二进制最高位和十进制最高位位置完全不对应 - 负数符号、前导零、进制歧义——这些在位运算里全无定义,却在回文判断中决定结果
最易被忽略的不是算法结构,而是 x % 10 == 0 && x != 0 这一行里那个 && x != 0:少了它,0 就被拦住,而 0 是回文数。
立即学习“C++免费学习笔记(深入)”;


















