leetcode 常见报错汇总
16436
2022.03.31
2022.03.31
发布于 未知归属地

leetcode 常见报错汇总

前言

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

内存报错

leetcode 用 AddressSanitizer 来检查内存问题,像下图这种一长串的地址信息就是报错信息了

image.png

Heap-buffer-overflow(堆溢出)

这个问题很常见,就是访问到非法内存,一般就是数组越界了,直接把相关索引打印出来检查一下就知道,比如在 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;
    }
};

报错

image.png

Heap-use-after-free(使用已释放内存)

这个问题我写 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;
    }
};

报错

image.png

Stack-buffer-overflow(栈溢出)

爆栈了,可能是递归层次太深,考虑改成迭代或备忘录优化,或者虽然是迭代,但是一直申请变量(在栈上,导致超过了最大限制),检查下是不是循环结束条件出了问题。

SEGV on unknown address(非法段内存)

一般来说,这个问题也是内存越界了,检查下数组下标即可

内存/指针没有初始化

循环引用/成环

链表、树成环

语法错误

语法错误一般比较简单,会直接提示错误行数和错误信息

Line x:

use of undeclared identifier

使用了未定义的变量,通常是变量名字敲错了,后面通常还跟着一句 did you mean 'xxx'? 什么的

vector<int> arr(3);

class Solution {
public:
    void solve(vector<vector<char>>& board) {
        int data;
        cout<<dat<<endl;   
    }
};

image.png

reference binding to null pointer of type

引用了空指针,比如链表、树题中,就经常遇到这个问题,检查下是不是访问空指针了

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        return list1->next->next;
    }
};

image.png

non-void function does not return a value

忘记写返回值了

class Solution {
public:
    vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
        
    }
};

image.png

expected ';' after return statement

忘记写 ; 号了

class Solution {
public:
    vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
        return {}
    }
};

image.png

error: expected '}’

括号没有一一对应,仔细检查一下,点击某个括号,另一个括号会高亮显示的,没有显示就没有匹配

class Solution {
public:
    vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
        return {;
    }
};

image.png

reference to non-static member function must be called

一般这个问题是因为 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);
    }
};

image.png

改正

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);
    }
};

addition of unsigned offset to

这个问题一般是两种情况:

  1. 数组索引为负数
  2. 无符号数溢出,比如 vector.size() 返回的就是一个无符号数
class Solution {
public:
    void solve(vector<vector<char>>& board) {
        board[-1];
    }
};

image.png

用例错误

is not a valid value of type xxx

输入用例不满足要求的类型,比如 string,array 等等

image.png

rapidjson::SizeType ... Assertion `IsArray()' failed

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

image.png

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

image.png

其它

执行代码返回结果正确,但提交解答却出错

使用了全局变量/静态变量,而 leetcode 全局变量/静态变量只初始化,后面的测试用例会接着使用前面的全局变量。

接近办法两个:

  1. 全局变量改局部变量
  2. 每次都初始化全局变量

超出时间限制

如题,就是超时了,这种情况一般两个可能:

  1. 本身算法的复杂度就达到了 1e8,1e9 的层次,需要改善算法
  2. 代码写出问题了,可能递归没有出口,循环结束条件出错等,导致一直运行

image.png

你的提交过于频繁,请稍候重试

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

image.png

避免注释行末尾出现 \

会自动注释下一行

如下代码,什么也不会输出

class Solution {
public:
    void solve(vector<vector<char>>& board) {
        // \
        cout<<"*"<<endl;
    }
};

发生未知错误,请稍后重试,如果此错误仍然存在,请与我们联系

这个问题经常遇到,感觉要么是网络问题,要么是其它正常问题,但却没有显示出来,建议再提交一次

总结

总结了不少常见的错误,不过还有一些遗漏的,总的来说下次遇见 debug 的思路要明确许多了。

参考

【C 语言刷 LeetCode】Address Sanitizer 常见报错

LeetCode 刷题中出现的奇怪的错误及解决办法

LeetCode 报错解决

为什么某些测试用例下,执行代码返回结果正确,但提交解答却出错了

Leetcode 中解决 stack/heap-buffer-overflow 错误

评论 (22)