Skip to content

个人学习过程中leetcode、牛客等刷题笔记

Notifications You must be signed in to change notification settings

ubeyu/notebook-code

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

leetcode-notebook刷题笔记

注意点

数组:

1.以下tmp赋值方法完全不同:
  ① 直接赋值,赋值完毕与nums无关:
    int[] tmp=new int[nums.length];
    for(int i=0;i<nums.length;i++){
        tmp[i]=nums[i];
    } 
  ② 引用,类似指针,tmp会随着nums变化而实时变化:
    int[] tmp=nums;
2.利用HashSet的元素不重复性,涉及到:set.contains(nums[i])、set.add(nums[i])方法。同时HashSet和HashMap相比Set是一维,Map是二维。
3.利用Arrays.sort(nums)排序方法,先排序,再判断相邻是否相等。

字符串:

1.long而非Long;
2.s.charAt(i)而非s.charAt[i];
3.s.indexOf('')可以找到字符在字符串的索引;
4.字符的大写字母比小写字母ASCII码小 32;
5.操作可变字符串使用StringBuilder或StringBuffer,在这些字符串尾部追加字符时用append;
6.equals可用于字符串的比较,不变字符串一般放到前面;
7.substring判断相等一般可以改写为循环每一位判断;
8.append时最好不要多个变量放到一起,可能会造成相加的现象;
               sb.append(String.valueOf(cur) + (sequence.charAt(sequence.length()-1)));
    最好写成:    sb.append(String.valueOf(cur));
                 sb.append((sequence.charAt(sequence.length()-1)));
9.String.valueOf(cur)将int型转为String型。
10.for循环内少一些判断可以优化时间复杂度;
11.判断当前字符串是否超过32位整数,可用 Long.parseLong(sb.toString()) >= Integer.MAX_VALUE;
12.Java封装类和基本数据类型,Long和long的区别:
   · Java的数据类型分为两种:
        ① 基本类型:byte(8),short(16),int(32),long(64),float(32),double(64),char(16), boolean(1)
        ② 对象类型:Byte,Short,Integer,Long,Float,Double,Character,Boolean
   · 上面的对象类型分别是基本类型和包装类型,例如Byte是byte的包装类。
   · Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样8个基本数据类型对应的类统称为包装类(Wrapper Class)
   · 对于包装类说,这些类的用途主要包含两种:
        a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
        b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。
     Long数据的大小的比较
   · 对于Long类型的数据,这个数据是一个对象,所以对象不可以直接通过“>”,“==”,“<”的比较,如果要比较两个对象的是否相等的话,我们可以用Long对象的.equals()方法:
            Long l1 = new Long(100);  
            Long l2 = new Long(200);  
            System.out.println(l1.equals(l2));  
   · 如果要进行“>”,“<”的比较的话,可以通过Long对象的.longValue()方法:
            Long l1 = new Long(100);  
            Long l2 = new Long(200);  
            System.out.println(l1.longValue()<l2.longValue());  
   · long数据的大小的比较
      对于long类型的数据,这个数据是一个基本数据类型,不属于对象,所以可以直接通过“>”,“==”,“<”作比较
            long l3 = 300;  
            long l4 = 400;  
            System.out.println(l3>l4);  
            System.out.println(l3<l4);  
            System.out.println(l3==l4);
                    
   · Long.ValueOf("String")返回Long包装类型
   · Long.parseLong("String")返回long基本数据类型

链表:

1.链表删除节点方法:
 ① 输出删除节点的上个节点node,将node.next赋值为node.next.next;
 ② 输出删除节点node,将node.val赋值为node.next.val,next赋值为node.next.next。
2.引入: ListNode dummy=new ListNode(0);
         dummy.next=head;
  可以处理length为1,n为1的情况。
  即没有进入for循环,可直接利用 dummy.next=dummy.next.next 将头结点赋为空。
3.需要有一个中间变量 tmp 用于保存当前 cur 的下一个节点信息,若不保存则在 cur.next = pre 这一步后丢失。
4.ListNode prev =new ListNode(0);
  ListNode pre = prev;
  这样可以新建链表,同时返回其头结点。
5.LeetCode 21.《合并两个有序链表》题解的递归调用很精妙,多学习!
6.//一定要在赋值前,不然赋值后位置就变了
   fast = fast.next.next;

树:

1.树的层序遍历——广度优先搜索 BFS: 用队列 Queue
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isValidBST(TreeNode root) {
        if(root == null) return true;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            while(size > 0){
                TreeNode node = queue.poll();
                if(node.left != null){
                    if(node.left.val >= node.val) return false;
                    if(node.left.right != null && node.left.right.val >= node.val) return false;
                    queue.offer(node.left);
                }
                if(node.right != null){
                    if(node.right.val <= node.val) return false;
                    if(node.right.left != null && node.right.left.val <= node.val) return false;
                    queue.offer(node.right);
                }
                size--;
            }
        }
        return true;
    }
}

2.树的先序遍历——深度优先搜索 DFS: 用栈 Stack
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isValidBST(TreeNode root) {
        if(root == null) return true;
        Stack<TreeNode> stack = new Stack<>();
        stack.add(root);
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            if(node.right != null){
                if(node.right.val <= node.val) return false;
                if(node.right.left != null && node.right.left.val <= node.val) return false;
                stack.push(node.right);
            }
            if(node.left != null){
                if(node.left.val >= node.val) return false;
                if(node.left.right != null && node.left.right.val >= node.val) return false;
                stack.push(node.left);
            }
        }
        return true;
    }
}

3.树的中序遍历,递归和Stack两种方法。

4.Queue和Deque:
队列(queue)是一种常用的数据结构,可以将队列看做是一种特殊的线性表,该结构遵循的先进先出原则。Java中,LinkedList实现了Queue接口,因为LinkedList进行插入、删除操作效率较高;
双向队列(Deque)是Queue的一个子接口,双向队列是指该队列两端的元素既能入队(offer)也能出队(poll),如果将Deque限制为只能从一端入队和出队,则可实现栈的数据结构。对于栈而言,有入栈(push)和出栈(pop),遵循先进后出原则。

排序和搜索:

1.二分查找:
建立 l、r、mid 三个参数用于二分查找。
while(l < r) 为二分查找循环退出条件。
mid 在 while 内赋值,mi d的初始化一般在 while 外面可以节省空间。
如果当前 mid 位的值还未出现错误,则 l 为 mid+1 (因为不可能是mid位了);
如果当前 mid 位的值出现错误,则 r 为 mid (因为可能是mid位);
当结束循环时,返回 l,或 r 都可。

public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
        int l = 1, r = n, mid;
        while(l < r){
            mid = l + (r-l)/2;
            if(!isBadVersion(mid)){
                l = mid + 1;
            }else{
                r = mid;
            }
        }
        return l;
    }
}

2.

About

个人学习过程中leetcode、牛客等刷题笔记

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published