2-3 LC622 设计循环队列 字节校园每日一题 LC449 序列化和反序列化二叉搜索树 Java力扣刷题笔记

文章目录

  • LC622 设计循环队列
    • 1.读题
    • 2.解题思路
    • 3.代码逻辑
    • 4.Java代码
  • 【字节校园每日一题】LC449 序列化和反序列化二叉搜索树
    • 1.读题
    • 2.解题思路
    • 3.x代码逻辑x
    • 4.Java代码

LC622 设计循环队列

我的力扣题解(第一次写题解QAQ)
我的刷题笔记
设计循环队列

1.读题

设计你的循环队列(也被称为“环形缓冲器”)实现。
循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

本题我们要实现支持如下操作的方法

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。
  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

2-3 LC622 设计循环队列 字节校园每日一题 LC449 序列化和反序列化二叉搜索树 Java力扣刷题笔记_第1张图片

2.解题思路

本题考查封装思想~
【1】设计队列需要一个队列元素数量计数器——来进行队列判满 判空操作
【2】要写好构造器!(包括头指针 尾指针 队列元素数量计数器)
【3】设计时的重点就是对头指针和尾指针的操作了

3.代码逻辑

这题没啥逻辑好说了

1.先写构造器
【1】队列容量
【2】头指针
【3】尾指针
【4】当前队列中的元素个数

2.之后进行队列的初始化(定好是多长的队列)
3.之后写好入队 出队的方法就行 别忘了return false 和 true
4.获取队头&尾的元素 更简单辽
5.判空 判满 这。。就一个if就完事了哦

4.Java代码

class MyCircularQueue {
    int[] arr;//定义队列数组
    int size;//定义好队列的总容量!
    int head;//头指针
    int tail;//尾指针
    int count;//计数器 用来记录现在队列中有多少元素
    public MyCircularQueue(int k) {
        //写好构造器!
        this.arr = new int[k];
        size = k;
        this.head = 0;
        this.tail = 0;
        this.count = 0;
    }
    
    public boolean enQueue(int value) {
        //入队操作
        if(isFull()) return false;
        arr[tail] = value;
        //入队完之后 让tail指针加一(但是不能只加一!要让tail指针循环起来!!)
        tail = (tail + 1) % size;
        //这样可以让tail指针循环起来
        //一旦tail = arr.size()-1(也就是指向了最后一位) 就会从头开始(tail=0)
        count += 1;//元素数量加一
        return true;
    }
    
    public boolean deQueue() {
        //出队操作
        if (isEmpty()) return false;
        head = (head + 1) % size;//同样让head指针循环起来!
        count -= 1;
        return true;
    }
    
    public int Front() {
        if (isEmpty()) return -1;
        return arr[head];
    }
    
    public int Rear() {
        if (isEmpty()) return -1;
        //注意!tail指向的位置 不是尾部元素!(arr[tail])
        return arr[(tail - 1 + size) % size]; //避免出现负数的操作!
    }
    
    public boolean isEmpty() {
        return count == 0;//count为0(即为队空) 返回真(即为true)
    }
    
    public boolean isFull() {
        return size == count;//count=size(即为队满) 返回真(即为true) 
    }
}

【字节校园每日一题】LC449 序列化和反序列化二叉搜索树

我的刷题笔记
序列化和反序列化二叉搜索树

1.读题

首先要知道什么是序列化

序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。

设计一个算法来序列化和反序列化二叉搜索树 。
对序列化/反序列化算法的工作方式没有限制。
我们只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树

编码的字符串应尽可能紧凑。

2-3 LC622 设计循环队列 字节校园每日一题 LC449 序列化和反序列化二叉搜索树 Java力扣刷题笔记_第2张图片

2.解题思路

用深度优先遍历~
DFS遍历是从根节点开始,一直往左子节点走,当到达叶子节点的时候会返回到父节点,然后从从父节点的右子节点继续遍历

3.x代码逻辑x

本题完成太草率啦!
二刷再多了解吧。

4.Java代码

class Codec {

    //把树转化为字符串(使用DFS遍历,也是前序遍历,顺序是:根节点→左子树→右子树)
    public String serialize(TreeNode root) {
        //边界判断,如果为空就返回一个字符串"#"
        if (root == null)
            return "#";
        return root.val + "," + serialize(root.left) + "," + serialize(root.right);
    }

    //把字符串还原为二叉树
    public TreeNode deserialize(String data) {
        //把字符串data以逗号","拆分,拆分之后存储到队列中
        Queue<String> queue = new LinkedList<>(Arrays.asList(data.split(",")));
        return helper(queue);
    }

    private TreeNode helper(Queue<String> queue) {
        //出队
        String sVal = queue.poll();
        //如果是"#"表示空节点
        if ("#".equals(sVal))
            return null;
        //否则创建当前节点
        TreeNode root = new TreeNode(Integer.valueOf(sVal));
        //分别创建左子树和右子树
        root.left = helper(queue);
        root.right = helper(queue);
        return root;
    }
}



你可能感兴趣的:(力扣刷题,算法强化之路,#,力扣刷题笔记,队列,java,算法,数据结构,二叉树)