一、链表-算法总结

news2024/11/15 7:19:15

文章目录

  • 一、链表
    • 1.1 提纲
    • 1.2 链表删除
      • 1.2.1 删除排序链表中的重复元素(仅保留一个重复元素)
      • 1.2.2 删除排序链表中的重复元素 II (删除所有重复的元素)
    • 1.3 链表反转
      • 1.3.1 反转链表
      • 1.3.2 反转链表
    • 1.4 合并链表
      • 1.4.1 合并两个有序链表
      • 1.4.2 合并K个升序链表
    • 1.5 快慢指针
      • 1.5.1 链表的中间结点
      • 1.5.2 重排链表
      • 1.5.3 回文链表
    • 1.6 结构判断
      • 1.6.1 环形链表
      • 1.6.2 环形链表 II
    • 1.7 其他
      • 1.7.1 删除链表的倒数第 N 个结点
      • 1.7.2 复制带随机指针的链表

一、链表

https://chienmy.gitbook.io/algorithm-pattern-java/shu-ju-jie-gou/linked_list

1.1 提纲

  • null 异常处理
  • dummy node 哑巴结点
  • 快慢指针
  • 插入一个结点到排序列表
  • 从一个链表中移除一个结点
  • 翻转链表
  • 合并两个链表
  • 找到链表的中间结点

1.2 链表删除

1.2.1 删除排序链表中的重复元素(仅保留一个重复元素)

83. 删除排序链表中的重复元素
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    /**
    解题思路:
    1、使用辅助结点p指向第一个结点;
    2、(注意:前提是已排好序)依次从当前位置的下一个结点开始判断是否与当前结点的值相同
        (2-1) 不相同则将当前指针p指向下一个位置
        (2-2) 相同则将当前结点的next指向下下个位置,再判断当前位置的下一个位置(即:循环作2的判断。实际是不断的删除与p临近的相同值的结点)
        注:任务中需保留一个重复值的结点,我们的方法会保留重复结点的第一个结点
    3、返回头指针    
    
     */
    public ListNode deleteDuplicates(ListNode head) {
        ListNode p = head;
        while(p!=null){
            while(p.next != null && p.val == p.next.val){
                p.next = p.next.next;
            }
            p = p.next;
        }
        return head;
    }
}

1.2.2 删除排序链表中的重复元素 II (删除所有重复的元素)

82. 删除排序链表中的重复元素 II
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    /**
    思路分析:
    1、定义一个头结点,其next指向首元结点(可能删除首元结点)
    2、定义一个辅助结点p指向头结点,依次判断当前结点的下一个与下下一个是否重复
        (2-1) 如果没有重复,则将p指向下一个结点位置
        (2-2) 如果重复则以当前结点作为待删除结点的前一个结点位置,依次删除后面的重复元素结点并修改p的next值
    3、返回头结点的next(首元结点)
    
     */
    public ListNode deleteDuplicates(ListNode head) {
        // 设置头结点,指向首元结点(由于首元结点可能被删除)
        ListNode dummy = new ListNode(-1,head);

        // p 指向需要判断是否重复元素的前一个结点位置(由于需要修改被删除结点的前一个结点的next)
        ListNode p = dummy;
        int n;
        while(p.next!=null && p.next.next != null){
            // 出现连续两个的重复的结点
            if(p.next.val == p.next.next.val){
                // 保存结点的重复值
                n = p.next.val;
                // 依次从第一个重复结点位置向后(头)删除重复元素的结点,并修改前一结点位置的next
                while(p.next!=null && p.next.val == n){
                    p.next = p.next.next;
                }  
            }else{
                p = p.next; // 没有连续重复的结点则向后判断
            }
        }

        return dummy.next;

    }
}

1.3 链表反转

1.3.1 反转链表

206. 反转链表
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    
    /**
    思路分析:
    method1: 基于迭代法
    1、依次创建 指向当前结点与当前结点下一个结点的指针 curr 与 next,并创建一个反转链表的首元结点 prev
    2、依次用头插法将当前的结点插入至 prev,并迭代 curr 为 next 直至 尾结点
    
    method2:基于递归(略)
    
     */
    public ListNode reverseList(ListNode head) {
        // method1: 基于迭代的方法
        // ListNode curr = head,next,prev=null;
        // while(curr!=null){
        //     next = curr.next;
        //     curr.next = prev;
        //     prev = curr;
        //     curr = next;
        // }
        // return prev;

        // method 2: 基于迭代法
        return recursion(head);

    }

    private ListNode recursion(ListNode head){
        // head == null 表示头指针为头指针为 null
        // head.next == null 表示此时 head 为尾结点
        if(head == null || head.next == null){
            return head;
        }
        // newHead 指向原链表的尾结点
        ListNode newHead = recursion(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }

}

1.3.2 反转链表

92. 反转链表 II
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    /**
    思路分析:
    1、定位至待反转链表首元结点的前一个位置(从新创建的头结点开始)
    2、反转区间链表
    3、重置原区间链表的左边界前一结点的next与右边界结点的next
    
     */

    public ListNode reverseBetween(ListNode head, int left, int right) {
        // 设置哑结点(可能从首元结点开始反转)
        ListNode dummy = new ListNode(-1,head);
        // 定位到需要反转位置的第一个结点的前一个位置(默认从头结点开始先后搜索)。由于需要在前一个结点的next中保存反转后的首元结点
        ListNode p = dummy;
        for(int i = 0;i < left-1;i++){
            p = p.next;
        }

        // 从当前位置的右侧第一个结点开始直至right进行反转(基于迭代法)
        ListNode curr = p.next,next,prev=null;
        for(int i = left;i<=right;i++){
            next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }

        // 修改反转后的链表首元结点前一位置的next与,尾结点的next
        // 此时 p.next指向反转后链表的尾结点
        // curr 指向原链表区间的尾结点的后一个结点(可能为null)
        p.next.next = curr;
        p.next = prev;

        return dummy.next;
    }
}

1.4 合并链表

1.4.1 合并两个有序链表

21. 合并两个有序链表
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    

    /**
    思路分析
    1、创建哑结点(头结点)用于保存两条链表上的结点
    2、双指针同时遍历得到较小元素的结点并插入结果结果链表中
    3、将还有结点的链表插入结果链表
    
     */
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        // 设置哑结点(头结点)
        ListNode dummy = new ListNode(-1);
        ListNode p = dummy;
        while(list1!=null && list2!=null){
            if(list1.val < list2.val){
                p.next = list1;
                list1 = list1.next;
            }else{
                p.next = list2;
                list2 = list2.next;
            }
            p = p.next;
        }
        p.next = list1!=null?list1:list2;
        return dummy.next;

    }
}

1.4.2 合并K个升序链表

23. 合并K个升序链表
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    
    /**
    思路分析:利用归并排序的分治思想
    1、递归实现"分"
    2、使用合并算法实现"治"

    
     */

    public ListNode mergeKLists(ListNode[] lists) {
        // 基于归并排序的思想
        if(lists==null || lists.length<=0){
            return null;
        }
        return mergeLists(lists,0,lists.length-1);
    }

    // 分治算法。先分后治
    private ListNode mergeLists(ListNode[] lists,int left,int high){
        if(left==high){
            return lists[left];
        }
        int mid = (left+high) >> 1;
        ListNode lNode = mergeLists(lists,left,mid);
        ListNode rNode = mergeLists(lists,mid+1,high);
        return merge(lNode,rNode);
    }

    // 合并两条链表
    private ListNode merge(ListNode l1,ListNode l2){
        ListNode dummy = new ListNode(-1);
        ListNode p = dummy;
        while(l1!=null && l2!= null){
            if(l1.val < l2.val){
                p.next = l1;
                l1 = l1.next;
            }else{
                p.next = l2;
                l2 = l2.next;
            }
            p = p.next;
        }
        p.next = l1!=null?l1:l2;
        return dummy.next;
    }
    
}

1.5 快慢指针

1.5.1 链表的中间结点

876. 链表的中间结点
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    /**
    思路分析:
    基于快慢指针的关系:快指针走的步数是满指针的2倍
    
    
     */
    public ListNode middleNode(ListNode head) {
        // 定义快慢指针
        // 快指针每次走2步
        ListNode fast = head;

        // 慢指针每次走1步
        ListNode slow = head;

        // situation1:对于偶数个结点的链表,中间结点定位的是相对后一个结点
        while(fast!=null && fast.next!=null){
            fast = fast.next.next;
            slow = slow.next;
        }


        // situation2:对于偶数个结点的链表,中间结点定位的是相对前一个结点
        // while(fast.next!=null && fast.next.next!=null){
        //     fast = fast.next.next;
        //     slow = slow.next;
        // }
        return slow;
    }
}

1.5.2 重排链表

143. 重排链表
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    /**
    思路分析:
    1、找到中间结点(偶数个结点的链表找打相对前一个)。划分前后链表
    2、反转后一链表
    3、合并前后链表
     */

    public void reorderList(ListNode head) {
        // 一、划分链表
        ListNode lLinkedList = getPreEndListNode(head);
        ListNode rLinkedList = lLinkedList.next;
        // 二、反转链表
        ListNode rrLinkedList = reverseLinkedList(rLinkedList);
        // 三、合并两条链表
        lLinkedList.next = null; // 设置左链表的尾元素的next为null
        ListNode p=head, rr = rrLinkedList,rNext;
        while(p!=null && rr!=null){
            rNext = rr.next;
            rr.next = p.next;
            p.next = rr;
            p = rr.next;
            rr = rNext;
        }

    }

    private ListNode reverseLinkedList(ListNode head){
        ListNode curr = head,next,prev=null;
        while(curr!=null){
            next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }

    private ListNode getPreEndListNode(ListNode head){
        // 基于快慢指针,找到中间结点
        ListNode slow = head;
        ListNode fast = head;
        while(fast.next!=null&&fast.next.next!=null){
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }
}

1.5.3 回文链表

234. 回文链表
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    /**
    思路分析:
    1、基于快慢指针找到中间结点(偶数个结点的链表找到相对前一个)
    2、反转后一链表
    3、按位置依次比较是否相同

     */

    private ListNode reverseLinkedList(ListNode head){
        ListNode curr=head,next,prev=null;
        while(curr!=null){
            next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }


    public boolean isPalindrome(ListNode head) {
        // 一、基于快慢指针划分链表
        ListNode slow = head;
        ListNode fast = head;
        while(fast.next!=null&& fast.next.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }

        // 二、反转后一链表
        ListNode rLinkedList = reverseLinkedList(slow.next);

        // 三、依次比较链表
        ListNode l1 = head;
        ListNode l2 = rLinkedList;
        boolean result = true;
        while(result && l2!=null){
            if(l1.val!=l2.val){
                result = false;
            }
            l1 = l1.next;
            l2 = l2.next;
        }

        // 四、(可选)恢复原链表
        // 由于左链表的尾指针一直指向原链表的右半链表的首元结点,因此只需要反转右链表即可
        reverseLinkedList(rLinkedList);
        return result;

    }

}

1.6 结构判断

1.6.1 环形链表

141. 环形链表
在这里插入图片描述

在这里插入图片描述

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {    
    /**
    基于快慢指针
     */
    public boolean hasCycle(ListNode head) {
       ListNode slow = head;
       ListNode fast = head;
       while(fast!=null && fast.next!=null){
           slow = slow.next;
           fast = fast.next.next;
           if(slow == fast){
               return true;
           }
       } 
       return false;
    }
}

1.6.2 环形链表 II

142. 环形链表 II
在这里插入图片描述

https://leetcode-cn.com/problems/linked-list-cycle-ii/solution/linked-list-cycle-ii-kuai-man-zhi-zhen-shuang-zhi-/
解题思路

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    /**
    基于快慢指针的第二次相遇
     */
    public ListNode detectCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){ // 第一次相遇
                fast = head; // 重置 fast 的位置
                // 使 slow 与 fast 第二次相遇则是环的入口结点位置
                while(fast != slow){
                    fast = fast.next;
                    slow = slow.next;
                }
                return slow;
            }
        }

        // 没有环则返回 null
        return null;

    }

}

1.7 其他

1.7.1 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 设置哑结点
        ListNode dummy = new ListNode(-1,head);

        // 基于快慢指针
        ListNode slow = dummy;
        ListNode fast = dummy;
        for(int i = 0;i<n;i++){
            fast = fast.next;
            if(fast==null){
                return null;
            }
        }
        while(fast.next!=null){
            fast = fast.next;
            slow = slow.next;
        }
        
        // 删除倒数第 n 个结点
        slow.next = slow.next.next;

        return dummy.next;
    }
}

1.7.2 复制带随机指针的链表

138. 复制带随机指针的链表
在这里插入图片描述

题解:https://leetcode-cn.com/problems/copy-list-with-random-pointer/solution/fu-zhi-dai-sui-ji-zhi-zhen-de-lian-biao-c2nvs/

/*
// Definition for a Node.
class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/

class Solution {
    /**
    思路分析:method1: 基于迭代的方法
    1、依次建立一个与原节点值相同的新节点到原结点的后面
    2、复制原结点的random指向的新结点的复制结点,到新节点中(p.next.random = p.random.next 需要注意p.random为null的情况)
    3、修改新链表每个结点的next指针,并还原原链表的next指针
    
     */
    public Node copyRandomList(Node head) {
        // 基于迭代的方法
        if(head == null){
            return null;
        }
        Node p = head,temp;
        // 依次在原节点后深复制一个值与原结点相同的结点
        while(p!=null){
            temp = new Node(p.val);
            temp.next = p.next;
            p.next = temp;
            p = temp.next;
        }

        // 复制源节点的random指针到新链表的结点中
        p = head;
        while(p!=null){
            p.next.random = ((temp=p.random)==null?temp:temp.next);
            p = p.next.next;
        }

        // 依次构建新链表中结点的next指针,并还原原链表的next
        p = head;
        Node newHead = head.next;
        boolean flag = true;
        while(p!=null && flag){
            if((temp = p.next.next) == null){
                flag = false;
            }else{
                p.next.next = temp.next; // 新链表结点的next设置
            }
            p.next = temp; // 还原原始结点的next
            p = p.next;
        }

        return newHead;

    }
}
/*
// Definition for a Node.
class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/

class Solution {
    /**
    思路分析:method2:基于哈希表与回溯算法
     - 在基于深度优先遍历记录原结点与新节点的hash对应关系(如果已经遍历则返回hashMap中的值)
     */

    private HashMap<Node,Node> hashMap = new HashMap<>();
    
    public Node copyRandomList(Node head) {
        return dfs(head);
    }

    private Node dfs(Node head){
        if(head == null){
            return head;
        }
        // 创建当前结点的信息到hashMap
        // 若已经遍历则返回存储的结点
        if(hashMap.containsKey(head)) return hashMap.get(head);
        
        // 若没有遍历则创建结点后保存并返回
        Node clone = new Node(head.val);
        hashMap.put(head,clone);

        clone.next = dfs(head.next);
        clone.random = dfs(head.random);
        return clone;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2130632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图新地球-将地图上大量的地标点批量输出坐标到csv文件【kml转excel】

0.序 有很多用户需要在卫星影像、或者无人机航测影像、倾斜模型上去标记一些地物的位置&#xff08;如电线杆塔、重点单位、下水盖等&#xff09; 标记的位置最终又需要提交坐标文本文件给上级单位或者其他部门使用&#xff0c;甚至需要转为平面直角坐标。 本文的重点是通过of…

第 1 0 章OpenCV

本章概述如何通过 Python 接口使用流行的计算机视觉库 OpenCV。OpenCV 是一个C 库&#xff0c;用于&#xff08;实时&#xff09;处理计算视觉问题。实时处理计算机视觉的 C 库&#xff0c;最初由英特尔公司开发&#xff0c;现由 Willow Garage 维护。OpenCV 是在 BSD 许可下发…

基于深度学习的医学图像分类与诊断系统(开题报告免费领)

深度学习开始大放异彩的工作&#xff0c;莫过于在ImageNet数据集上&#xff0c;对输入图片的分类了。只要输入图片&#xff0c;就能判断图片中主体所属的类别。然而&#xff0c;和分类问题输入图像输出主体的类别不一样&#xff0c;分割问题需要对每个像素点的类别进行识别。下…

Unity实现自己的协程系统(协程有顺序)

你的类可以在不继承Mono的脚本使用协程,但本质仍然需要借助其他Mono对象的Update来调度 实现了一个有执行顺序的协程的调度器&#xff0c;用于在 Unity 中管理多个协程的执行。通过 ICoroutineNodeOrder 和 ICoroutineWaitCondition 两个接口&#xff0c;可以定义每个协程的执行…

labview禁用8080端口

需求背景 最近电脑上安装了labview全家桶,发现idea的8080端口项目启动报错,一直提示8080端口被占用。最简单的办法就是找到8080端口的服务,然后关闭这个服务。但是我不想这么做,我想把labview的web服务器的端口给修改了。 操作教程 1、cmd查看8080端口 2、windows进程 同…

ICM20948 DMP代码详解(17)

接前一篇文章&#xff1a;ICM20948 DMP代码详解&#xff08;16&#xff09; 前一篇文章讲到了inv_icm20948_set_chip_power_state函数中尚需解析的3个函数中的第1个函数&#xff1a;inv_icm20948_write_single_mems_reg_core。并没有完全讲完&#xff0c;本回继续解析。为了便于…

搭建本地DVWA靶场教程 及 靶场使用示例

1. DVWA简介 DVWA&#xff08;Damn Vulnerable Web Application&#xff09;一个用来进行安全脆弱性鉴定的PHP/MySQL Web 应用平台&#xff0c;旨在为网络安全专业人员测试自己的专业技能和工具提供合法的环境&#xff0c;帮助web开发者更好的理解web应用安全防范的过程。 DVW…

利用MR设备实现弹吉他教学:实战案例详解

随着混合现实(Mixed Reality, MR)技术的发展,越来越多的应用开始探索如何将这种沉浸式的体验融入到教育与娱乐中。特别是在音乐教育领域,MR技术为乐器学习提供了全新的可能性。本文将通过分析一个基于Unity开发的吉他教学应用案例,探讨如何利用MR设备,如Oculus Quest或Ap…

Boot中使用Redis缓存

除了RedisTemplate,Spring Cache 还有如下方式 即使不写Repository也可以自动注入 只要extends CrudRepository 最好不要写Repository有可能冲突 自动注入用Autowired或Resource都可

Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用增强扩展(text2sql)

前言 我在上一篇文章中《Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用&#xff08;text2sql&#xff09;》 利用langchain 中create_sql_agent 创建一个数据库代理智能体&#xff0c;但是实测中发现&#xff0c;使用 create_sql_agent 在对话中&#x…

yolo学习 (一) 安装yolov8及训练

随便搞个python环境&#xff0c;直接装或者anaconda都行&#xff0c;python版本最低3.8以上 一、安装yolov8 &#xff08;cpu版本&#xff09; pip install ultralytics yolov8安装版本比较省事&#xff0c;不过这里默认装的是CPU版本 import torch print(torch.__version_…

基于stm32单片机使用 RT-Thread 系统的 ADC 外设

一、ADC 介绍 来源&#xff1a;RT-Thread 文档中心   ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号&#xff0c;例如温度、压力、声音或者图像等&#xff0c;需要转换成更容易储存、处理和发射…

手机玩机常识-------谷歌系列机型解锁bl详细步骤 其他机型可以借鉴参考

谷歌公司自从在2005年收购了Android公司之后一直在开发一款手机操作系统&#xff0c;谷歌的这一举动正是为了推出自己的手机而作准备.目前。谷歌Pixel 系列为很多玩家所持有。其独特的安装原生系统为很多粉丝所青睐。今天我们来看看谷歌Pixel 系列机型解锁bl的相关常识 谷歌Pi…

CTF(misc)

1、隐写3 题目链接 观察这个图片感觉图片高度有问题&#xff0c;010editor打开&#xff0c;查看CRC python脚本求宽高 import os import binascii import struct crcbp open("dabai.png","rb").read() for i in range(1024):for j in range(1024):data …

操作系统 ---- 调度器、闲逛进程

一、调度器/调度程序&#xff08;scheduler&#xff09; 2、③由调度程序引起&#xff0c;调度程序决定: 让谁运行?――调度算法运行多长时间?―一时间片大小 调度时机――什么事件会触发“调度程序”? 创建新进程进程退出运行进程阻塞I/O中断发生&#xff08;可能唤醒某…

大受欢迎的游戏却又意外被作者下架的《Flappy Bird》将重返iPhone

据"Flappy Bird 基金会"官网称&#xff0c;标志性的侧卷轴滚动游戏《Flappy Bird》将很快回归 iPhone。《Flappy Bird》于 2013 年发布&#xff0c;很快就获得了数千万次下载。然而&#xff0c;这款游戏在2014 年突然从 App Store 下架&#xff0c;原因是其越南开发者…

SD卡挂载FatFs文件系统

一、简介 实验目的&#xff1a;SD卡挂载FATFS文件系统&#xff0c;并生成.txt文件 MCU&#xff1a;ST32F103ZET6 SD卡&#xff1a;16G&#xff1b;SPI读写模式&#xff1b; 引脚定义&#xff1a;VCC:5V GND:GND MISO:PA6 …

常用环境部署(十八)——CentOS7搭建DNS服务器

一、安装Bind服务器软件并启动 1、安装Bind服务 yum -y install bind bind* 2、 启动服务 systemctl start named 3、开机自启动 systemctl enable named 二、查看named进程是否正常启动 1、检查进程 ps -eaf|grep named 2、检查监听端口 ss -nult|grep :53 三、关闭…

EmguCV学习笔记 C# 11.6 图像分割

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

宠物毛发对人体有什么危害?宠物空气净化器小米、希喂、352对比实测

作为一个呼吸科医生&#xff0c;我自己也养猫。软软糯糯的小猫咪谁不爱啊&#xff0c;在养猫的过程中除了欢乐外&#xff0c;也面临着一系列的麻烦&#xff0c;比如要忍耐猫猫拉粑粑臭、掉毛、容易带来细菌等等的问题。然而我发现&#xff0c;现在许多年轻人光顾着养猫快乐了&a…