leetcode解题必备

124 阅读1分钟

一些要点

注意:手写或者机试可能没有代码提示,所以一些基本函数名要记得

  1. 整形,字符串互转

    //int -> string  
    Integer.toString(x)
    //String -> int  
    Integer.valueOf(s)
    
  2. 字符的反转函数

    
    /*
    * toString() 不能忘记,因为不用就是StringBuilder
    * String类没有reverse()方法
    * StringBuilder线程不安全;StringBuffer线程安全
    */
    new StringBuilder(s).reverse().toString()
    
  3. 字符串转字符数组函数

    s.toCharArray()
    s.charAt(i)
    
  4. 字符串、数组和链表的大小

    //字符串的()不能少
    s.length();
    arr.length;
    list.size();
    
  5. 栈的使用

    适合栈的问题:括号问题,路径问题,后进先出的问题;

    //先进后出栈
    Stack<Integer> stack = new Stack<>();
    stack.pop();//弹出
    stack.push(object);//压入
    stack.empty();//栈是否空
    stack.peek();//查看栈顶的元素,不移除
    

    链表实现栈

  6. KMP解法

    k m p 3个人名首字母 KMP 算法是一个快速查找匹配串的算法 没懂

  7. 动态规划

    基本的解法要知道 一个数组的最大子数组和;

  8. Math常用函数

    Math.max(a, b) // 比大小,返回最大的
    Math.abs(a) // 绝对值
    Math.pow(doublea, doubleb) // a^b
    
  9. 0-9字符 转整形

    char c = '9';
    int i = c - '0';
    int i2 = Intger.parseInt(Character.toString(c));
    
  10. 数组最大子序和

    思路:动态规划,

  11. 二叉树

    求最大深度

    public int maxDept(TreeNode root){
        if(root == null){
            return 0;
        }
        return 1 + Math.max(maxDept(root.left), maxDept(root.right));
    }
    

    前中后序遍历 是基础, 简单记住

    // 前序遍历
    public void recursionA(TreeNode root){
        if(root == null){
            return;
        }
    
        System.out.println(root.val);
    
        if(root.left != null){
            recursion(root.left);
        }
        if(root.right != null){
            recursion(root.right);
        }
    }
    
    // 中序遍历
    public void recursionB(TreeNode root){
        if(root == null){
            return;
        }
        
        if(root.left != null){
            recursion(root.left);
        }
    
        System.out.println(root.val);
    
        if(root.right != null){
            recursion(root.right);
        }
    }
    
    // 后序遍历
    public void recursionC(TreeNode root){
        if(root == null){
            return;
        }
        
        if(root.left != null){
            recursion(root.left);
        }
    
        if(root.right != null){
            recursion(root.right);
        }
    
        System.out.println(root.val);
    }
    
  12. 字符的ascII码

    “A”为65;“a”为97;“0”为 48

    代码里不使用数字也可使用字符在判断,记不住对应的数字

    字符ascii字符ascii字符ascii
    048A65a97
    149B66b98
    250C67c99
    351D68d100
    452E69e101
    553F70f102
    654G71g103
    755H72h104
    856I73i105
    957J74j106
    K75k107
    L76l108
    M77m109
    N78n110
    O79o111
    P80p112
    Q81q113
    R82r114
    S83s115
    T84t116
    U85u117
    V86v118
    W87w119
    X88x120
    Y89y121
    Z90z122
  13. 判断回文一般都是用双指针算法

    双指针
    排序的数组,一个在前 一个在后,根据条件缩搜索减空间

    链表的回文 快慢指针找出中点,翻转后面一段与开头对比

  14. 位运算的性质

    可判断不重复的那个数
    判断2个数相同,用异或
    异或,不同为1,相同为0
    a ^ 0 = a
    a ^ a = 0

  15. 判断数组链表是否有环
    判断是否进入了循环中

    hash表法: 就是遍历数组链表,如果元素在hash表中 说明有环,否则加进表中

    快慢指针法(龟兔算法):一快一慢,直到快的与慢的相遇,说明有环,空间o(1)

  16. 链表,树在代码中的形式【了解】

    // 链表
    ListNode{
        // 保存的值
        int val;
        // 下一指针地址
        ListNode next;
    
        ListNode(){}
    
        ListNode(int val, ListNode node){
            this.val = val;
            this.next = node;
        }
    }
    
    // =============^.^==================
    
    // 二叉树
    TreeNode{
        // 保存的值
        int val;
        // 左子节点
        TreeNode left;
        // 右子节点
        TreeNode right;
    
        TreeNode(){}
    
        TreeNode(int val, TreeNode left, TreeNode right){
            this.val = val;
            this.left = left;
            this.right = right;
        }
    
    }
    
    
  17. 常见方法

    • 暴力枚举 通常o(n^2)

    • hash表法 维持一个记录各个数的计数,最后选出最大的那个数 o(n)

    • 摩尔投票法 对拼消耗 选出众数,一个数组中最多的那个元素

  18. ans = ans * 26 + num

    26进制, * 26 等于 进位1位

  19. 数据库sql

    select 
    distinct  去除相同的结果
    left join  左连接
    where 条件
    group by  分组
    order by  排序
    having
    
    count() 
    ifnull(dd, cc)  判断dd是否为null,是取后面cc的值
    dateDiff(a.RecordDate, b.RecordDate)  得到2个日期的差
    

    on 和 where 的区别?

    ON 条件是在生成临时表时使用的条件,它不管 ON 中的条件是否为真,都会返回左边表中的记录; WHERE 条件是在临时表已经生成后,对临时表进行的过滤条件。因为此时已经没有 LEFT JOIN 的含义(必须返回左侧表的记录)了,所以如果 WHERE 条件不为真的记录就会被过滤掉。

  20. 翻转链表

        /**
         * 翻转链表,改变其箭头方向,将元素的下一结点指向前一个结点,前一个结点保存下来
         * 时间 o(n) 空间(1)
         */
        public ListNode reverseList(ListNode head){
            ListNode cur = head;
            ListNode pre = null;
            while(cur != null){
                // 下一个结点保存
                ListNode next = cur.next;
                // 重置下一个节点为前一个结点
                cur.next = pre;
                // 当前结点保存为前一个结点
                pre = cur;
                // 循环到下一个结点
                cur = next;
            }
            return pre;
        }
    

未完待续...