leetcode 也刷了不少题了,经常遇到各种各样的报错,最近更是在一个以前没有遇到的报错上 debug 了很久,最后才发现是测试用例的问题,故干脆怒而直接总结一下常见的报错,方便以后刷题。(我主要使用 c++,其它语言不清楚,应该也可以参考)
leetcode 用 AddressSanitizer 来检查内存问题,像下图这种一长串的地址信息就是报错信息了

这个问题很常见,就是访问到非法内存,一般就是数组越界了,直接把相关索引打印出来检查一下就知道,比如在 dp 中,经常会遇到 dp[i]=dp[i-1] 这种,当 i=0 就很容易越界。
错误代码
class Solution {
public:
void solve(vector<vector<char>>& board) {
vector<int> data(1);
cout<<data[2]<<endl;
}
};报错

这个问题我写 c++ 还没遇到过,写 c 初学倒是容易遇到,就是使用了已经不存在、释放的内存。
比如要 c 要返回一个数组,返回值是一个指针,在函数里你却分配在栈上,那么这个函数结束后,这块内存自动就回收了,自然返回会报错。
或者虽然你分配在了堆上,但是你却 delete 或 free 掉后又使用,那么还是会报错。
错误代码
class Solution {
public:
void solve(vector<vector<char>>& board) {
int *a=new int[10];
delete []a;
cout<<a[0]<<endl;
}
};报错

爆栈了,可能是递归层次太深,考虑改成迭代或备忘录优化,或者虽然是迭代,但是一直申请变量(在栈上,导致超过了最大限制),检查下是不是循环结束条件出了问题。
一般来说,这个问题也是内存越界了,检查下数组下标即可
链表、树成环
语法错误一般比较简单,会直接提示错误行数和错误信息
Line x:
使用了未定义的变量,通常是变量名字敲错了,后面通常还跟着一句 did you mean 'xxx'? 什么的
vector<int> arr(3);
class Solution {
public:
void solve(vector<vector<char>>& board) {
int data;
cout<<dat<<endl;
}
};
引用了空指针,比如链表、树题中,就经常遇到这个问题,检查下是不是访问空指针了
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
return list1->next->next;
}
};
忘记写返回值了
class Solution {
public:
vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
}
};
忘记写 ; 号了
class Solution {
public:
vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
return {}
}
};
括号没有一一对应,仔细检查一下,点击某个括号,另一个括号会高亮显示的,没有显示就没有匹配
class Solution {
public:
vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
return {;
}
};
一般这个问题是因为 sort 第三个比较器是直接传进去的,需要改成 static 或全局函数
报错
class Solution {
public:
bool cmp(int a,int b){
return a>b;
}
void solve(vector<vector<char>>& board) {
vector<int> a(10,9);
sort(a.begin(),a.end(),cmp);
}
};
改正
class Solution {
public:
static bool cmp(int a,int b){
return a>b;
}
void solve(vector<vector<char>>& board) {
vector<int> a(10,9);
sort(a.begin(),a.end(),cmp);
}
};或
bool cmp(int a,int b){
return a>b;
}
class Solution {
public:
void solve(vector<vector<char>>& board) {
vector<int> a(10,9);
sort(a.begin(),a.end(),cmp);
}
};这个问题一般是两种情况:
class Solution {
public:
void solve(vector<vector<char>>& board) {
board[-1];
}
};
输入用例不满足要求的类型,比如 string,array 等等

这题我在 17.24 题中就遇到过,直接把代码注释了也会报错

后来才发现是测试用例的问题,测试用例是我直接复制的例子,应该是解析的时候解析 json 失败了,总之,好好检查测试用例吧

使用了全局变量/静态变量,而 leetcode 全局变量/静态变量只初始化,后面的测试用例会接着使用前面的全局变量。
接近办法两个:
如题,就是超时了,这种情况一般两个可能:

如题,慢点提交吧,自己手动模拟一遍,走一遍测试用例,不要一直尝试,然后根据错误用例改代码,即使这样也要直接你改的代码究竟干了些什么,不然你可能根本就没有搞懂这个题,也学不到什么东西。

会自动注释下一行
如下代码,什么也不会输出
class Solution {
public:
void solve(vector<vector<char>>& board) {
// \
cout<<"*"<<endl;
}
};这个问题经常遇到,感觉要么是网络问题,要么是其它正常问题,但却没有显示出来,建议再提交一次
总结了不少常见的错误,不过还有一些遗漏的,总的来说下次遇见 debug 的思路要明确许多了。
【C 语言刷 LeetCode】Address Sanitizer 常见报错