LeetCode回文数C++代码报空指针运行错、恒返回true问题求解
LeetCode 回文数C++代码两类异常修复
异常1:运行时触发null pointer绑定int类型报错
- 核心原因:代码中
vector<int> v;声明的是长度为0的空vector,没有预先分配元素存储空间,后续循环直接通过v[i]按下标写入元素属于越界访问,是C++标准定义的未定义行为,会被内存检测工具捕获抛出错误。 - 附带隐藏风险:计算数字位数时使用的变量
k是int类型,循环中k=k*10遇到接近int上限的输入时会发生整数溢出,同样会触发未定义行为。 - 修复方案:
- 初始化vector时直接指定元素长度:
vector<int> v(j);,或者改用v.push_back(x%10)逐位向尾部插入元素,不要对空vector做下标访问。 - 将
k的类型改为long long,避免乘法过程中整数溢出。
- 初始化vector时直接指定元素长度:
异常2:判断结果恒返回true
- 首先澄清误区:布尔变量
b定义在函数最外层作用域,循环内给b赋值false是可以正常传递到外层return语句的,结果错误和变量作用域没有任何关系。 - 核心原因有三个:
- 前面vector越界写入的问题没有解决,容器内根本没有正确存入输入数字的每一位,内存中是随机垃圾值,判断逻辑从数据源上就失效。
- 回文对称位置的下标计算错误:代码写的是
v[j-l],但vector合法下标范围是0到j-1,当l=0时取到的下标是j,属于越界访问,读到的也是内存垃圾值,根本拿不到对称位置的正确数字。 - 没有处理边界场景:负数带负号不可能是回文数,末尾为0的非0数(比如10、100)也不可能是回文数,原代码没有提前拦截这类输入,会进入后续逻辑产生错误结果。
- 修复方案:
- 开头增加边界判断:负数、末尾为0的非0数直接返回false。
- 修正对称下标为
v[j-1-l],循环只需要遍历前半段元素即可,找到不匹配的位可以直接break跳出循环,减少无效计算。
修正后可运行代码
class Solution { public: bool isPalindrome(int x) { // 提前拦截不可能为回文的边界场景 if (x < 0 || (x % 10 == 0 && x != 0)) { return false; } // 计算数字位数,k用long long防溢出 long long k = 10; int j = 1; bool res = true; while (x / k != 0) { j++; k *= 10; } // 初始化vector时指定长度,避免越界 vector<int> digits(j); int tmp = x; for (int i = 0; i < j; i++) { digits[i] = tmp % 10; tmp /= 10; } // 遍历前半段判断对称位是否相等 for (int l = 0; l < j / 2; l++) { if (digits[l] != digits[j - 1 - l]) { res = false; break; } } return res; } };
注:这道题最优解法不需要借助vector存储每一位,直接反转后半段数字和前半段比较即可把空间复杂度降到O(1),上述代码是基于原有逻辑做的最小修改,保证逻辑正确可通过所有用例。
内容的提问来源于stack exchange,提问作者Tanishq thakur
相关产品推荐
相关产品推荐

