V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yazoox
V2EX  ›  程序员

LeetCode 怎么刷题比较快速高效,还容易复习/复盘?

  •  
  •   yazoox · 90 天前 · 1120 次点击
    这是一个创建于 90 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,

    可能又要准备找工作了,虽然现在经济行情都不好,但没有办法,只能继续捡起来 leetcode 刷。但发现效率很低,特来请教一下大家,有没有比较好的实践,能够快速刷题,尤其是能够快速复习。

    1. 目前我还是使用 c/c++做题比较多,感觉还是这个 language 做题最顺手。如果其它语言,有更有效率的刷题方法,我可以切换过去。(我还记得有个兄弟,说过用 Rust ,本地建立一个项目组还是啥的,能够把做完的题目管理起来,直接本地跑,不记得在哪里看到的了)
    2. vscode 可以用来刷题么?现在工作上面,用 vscode 很多,但是都是写前端,基本没有配置 c/c++,没有编译环境。不会还得安装一个 visual studo 吧
    3. 刚才试了一下 VSCode + leetcode (或 labuladong 插件),能够把 leetcode 的题目拉下来,在本地生成.cpp 文件,比如, 1.two-sum.cpp, 但是本地没有测试用例,没有办法跑起来。简单的代码没有问题,稍微有点复杂的代码,还是需要 debug ,或者跑跑测试的。我在 leetcode.com 上面,直接在线写,debug 功能需要付费(“考前”突击可以付费打开一断时间,但长时间使用,付不起)
    4. 还有一个需求,就是刷了几百道题后,怎么快速复习一下。如果在线一题一题的点,一题一题看的话,感觉效率很低。本地有大量文件的话,可能会快很多。

    Anyway ,就是想看看/听听大家的想法,学习一下先进高效的方法。

    谢谢

    /*
     * @lc app=leetcode id=1 lang=cpp
     *
     * [1] Two Sum
     */
    
    // @lc code=start
    class Solution {
    public:
      vector<int> twoSum(vector<int> &nums, int target) {
        unordered_map<int, int> valToIndex;
        for (int i = 0; i < nums.size(); i++) {
          // 查表,看看是否有能和 nums[i] 凑出 target 的元素
          int need = target - nums[i];
          if (valToIndex.count(need)) {
            return vector<int>{valToIndex[need], i};
          }
          // 存入 val -> index 的映射
          valToIndex[nums[i]] = i;
        }
        return vector<int>{};
      }
    };
    // @lc code=end
    
    jakoer2001
        1
    jakoer2001  
       89 天前
    我 vscode 用的插件有测试用例,C++还支持直接 debug 。插件的标识符是 ccagml.vscode-leetcode-problem-rating
    CLMan
        2
    CLMan  
       89 天前
    每个题独立的包或者模块,我刷题主用 Go ,也用过 Rust ,共存在一个项目里面。

    结构如下:
    ```
    go.mod
    Cargo.toml
    array
    question1

    ```
    CLMan
        3
    CLMan  
       89 天前
    我服了,随便按个键就自动回复了,啥设定啊。
    ------
    每个题独立的包或者模块,我刷题主要用 Go ,也用过 Rust ,共存在一个项目里面。

    结构如下( question1,question2 替换为对应问题的 url 路径,连字符 rust 用_,go 用-):
    ```
    go.mod
    Cargo.toml
    src/
    array/
    question1/
    solution_test.go
    question2.rs
    mod.rs
    dp/
    hash/
    ...
    lib.rs
    ```
    示例代码( contains-duplicate-iii.rs ):
    ```
    struct Solution {}

    // https://leetcode-cn.com/problems/contains-duplicate-iii/
    // 参考题解: https://leetcode-cn.com/problems/contains-duplicate-iii/solution/cun-zai-zhong-fu-yuan-su-iii-by-leetcode-bbkt/
    // 考点:滑动窗口、桶排序
    //
    // 一种朴素算法是计算所有可能的差值,时间复杂度为 kN ,空间复杂度为 O(1)
    //
    // 事实上,我们可以用空间换时间来改善算法。将数域根据其值划分所属空间,使用 hash 表记录当前空间的一个值
    // 在一次迭代所有值时,当前值可能:
    // 1. 所属空间有值,返回 true
    // 2. 所属上一个空间有值,两者差满足条件,返回 true
    // 3. 所属下一个空间有值,两者差满足条件,返回 true
    // 4. 将当前值记录到其空间中,同时维护窗口为大小 k:移动窗口并删除不在窗口内的值
    //
    //
    // 算法时间复杂度 O(N),空间复杂度主要是 hash 表的大小:O(min(k,N))

    impl Solution {
    fn get_id(n: i64, w: i64) -> i32 {
    if n >= 0 {
    (n / w) as i32 //0~w-1 属于 0
    } else {
    ((n + 1) / w - 1) as i32 //-w~-1 属于 -1
    }
    }
    pub fn contains_nearby_almost_duplicate(nums: Vec<i32>, k: i32, t: i32) -> bool {
    use std::collections::HashMap;
    let mut buckets: HashMap<i32, i32> = HashMap::new();
    let w: i64 = t as i64 + 1;
    // 省略实现代码
    false
    }
    }

    #[cfg(test)]
    mod tests {
    use crate::array::contains_duplicate_iii::Solution;

    #[test]
    fn test() {
    let nums = vec![2147483647, -1, 2147483647];
    let k = 1;
    let t = 2147483647;

    let ans = Solution::contains_nearby_almost_duplicate(nums, k, t);
    assert!(!ans)
    }
    }
    ```
    Go 版本就是需要一个单独的文件夹(包),里面代码也差不多,包括实现代码和测试代码。

    只要遵循特定语言的组织结构,测试规范,缝合其它语言进去也很容易。题目介绍、解题思路,可以放到代码里面,也可以单独用 markdown 文档记录,怎么顺手怎么来。
    CLMan
        4
    CLMan  
       89 天前
    https://imgur.com/a/YiUkw4T

    上面丢失了层次,给个图像(这是之前没用 go mod ,后来添加了 go.mod )。

    用啥都能刷吧,主要是层次清晰就 OK ,Go 和 Rust 都挺适合用 vscode 写,语言官方自带测试工具,写单元测试也容易。

    个人更喜欢用 Go ,不需要任何语法负担。

    至于复习,我个人刷题主要是练习题感,并没有期望面试遇到原题,复习更多是从系统的数据结构与算法知识层面。
    stevenluox1
        5
    stevenluox1  
       89 天前
    用文档记录一个刷题记录,好用
    linzhe141
        6
    linzhe141  
       89 天前
    ts+vitest ,自己写单测
    https://github.com/linzhe141/leetcode
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2823 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:13 · PVG 20:13 · LAX 05:13 · JFK 08:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.