关于刷 Coding 题的总结

Posted on Thu, Jan 12, 2023 总结 算法

这是一个总结,应该会花很长时间来完成,其目的是为了更好的准备OA VO等有关coding的内容。

Data Structures 数据结构

Array

String

Linked List

addFirst

Stack / Queue

Tree

Algorithms 算法

Dynamic Programming

Dynamic Programming

Basic Java Structure - How to code in ACM mode 框架在ACM模式下

  1. Basic skeleton: psvm String[] args - Scanner - nextLine/nextInt
  2. How to read string or int, and how to change type from string: Integer.parseInt(str) - Double.parseDouble(str) - str.toCharArray() - str.toLowerCase() - str.split(” ”)
  3. How to handle unlimited numbers: while(in.hasNextInt()){}
  4. How to convert output format:
// 基本框架,以HJ1字符串最后一个单词的长度为例
import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        String[] strs = str.split(" ");
        System.out.print(strs[strs.length-1].length());
    }
}

// 读取一行字符串的操作
Scanner in = new Scanner(System.in);
String str = in.nextLine().toLowerCase();
int num = in.nextInt();
// String -> char[]
char[] chars = str.toCharArray();
// String -> byte[]
byte[] bytes = str.getBytes();
// String -> int
int num1 = Integer.parseInt(str);
int num2 = Integer.valueOf(str).intValue();
int num3 = (new Integer(str)).intValue();
// String -> double
double double_num1 = Double.parseDouble(str);
double double_num2 = Double.valueOf(str).doubleValue();
double double_num3 = (new Double(str)).doubleValue();

// 华为指南,如何处理无限数字
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int a = in.nextInt();
            int b = in.nextInt();
            System.out.println(a + b);
        }
    }
}

Relationship between data range and algorithms selection 数据规模与算法选择

  1. O(n^2) 解决 n<1e4 的问题
  2. O(nlogn) 解决 n<1e6 的问题
  3. O(n) 解决 n <1e8 的问题
  4. O(logn) 解决 n>1e8 的问题

Author: here

My Coding Solutions in LeetCode

只有当我觉得官方题解不好的时候,我才会写题解。

15. 3Sum: https://leetcode.com/problems/3sum/solutions/3243029/an-intuitional-solution-3-ways-to-optimize-without-meaningless-1-or-1/

Others

https://www.bigocheatsheet.com/

什么时候该用dummy head?

dummy head本质是在做头节点一般化,在涉及对链表进行更改(如:增删改)的时候,引入dummy head是很重要的;但如果只是查找,用dummy head也不会有问题,只是麻烦了。

怎么算recursion的时间和空间复杂度?

See here. 空间复杂度就是递归关系乘以每个递归函数内部的时间复杂度O(1)*O(logN)=O(logN)。在任何时间点内存中可能存在的堆栈帧的最大数量等于递归树的最大深度,也就是如(104. Maximum Depth of Binary Tree),最大占用空间是一条最长的路,也就是树的最深度,即平均来说O(logN),最坏情况是单边树O(N)。

Notice when soloving LeetCode problems

Notice when solving codeforces problems

有的竞赛不让用Java的Math,向上取整的ceil和向上取模的mod写在这里。
private static int get_ceil(int a, int b) {
    return (a + b - 1) / b;
}
private static int get_mod(int a, int b) {
    return (a % b + b) % b;
}