优选算法 - 5 ( 栈 队列 + 宽搜 优先级队列 9000 字详解 )

一:栈

1.1 删除字符串中的所有相邻重复项

题目链接:删除字符串中的所有相邻重复项

在这里插入图片描述
在这里插入图片描述

class Solution {
    public String removeDuplicates(String _s) {
        // 用 StringBuffer 模拟一下栈结构
        StringBuffer ret = new StringBuffer();
        // 接着把 _s 转换为字符数组方便操作
        char[] s = _s.toCharArray();

        // 接着遍历一下这个字符数组
        for(char ch : s){
            // 因为栈顶元素的索引是 ret 的长度减一,为了保证不发生越界访问,我们要保证 ret 中的元素不为空
            //要避免越界异常,需要首先判断 ret 是否为空,再访问栈顶元素: if(ret.length() > 0 && ch == ret.charAt(ret.length() - 1))

            if(ret.length() > 0 && ch == ret.charAt(ret.length() - 1)) ret.deleteCharAt(ret.length() - 1);
            else ret.append(ch);
        }

        // 循环结束后 ret 就存储着最终的结果,返回即可
        return ret.toString();
    }
}

在这里插入图片描述

1.2 比较含退格的字符串

题目链接:比较含退格的字符串

在这里插入图片描述

在这里插入图片描述

class Solution {
   public boolean backspaceCompare(String s, String t)
    {
        // 调用 changeStr 方法处理字符串 s 和 t,比较它们的处理结果是否相等
        return changeStr(s).equals(changeStr(t));
    }

    // 辅助方法:将字符串中的退格符号(#)应用到字符串,返回最终的结果
    public String changeStr(String s){
        // 此时使用 StringBuffer 模拟栈结构
        StringBuffer ret = new StringBuffer();
        
        for(int i = 0; i < s.length(); i++){
            char ch = s.charAt(i);
            if(ch != '#') ret.append(ch);
            else{
                // 如果栈非空(ret 中有字符),删除栈顶字符(出栈操作)
                if (ret.length() > 0) ret.deleteCharAt(ret.length() - 1);
            }
        }

        return ret.toString();
    }
}

在这里插入图片描述

1.3 基本计算器 II

题目链接:基本计算器 II

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
    public int calculate(String _s) {
        // 用栈存储 Integer 类型的数字
        Stack<Integer> st = new Stack<>();
        char[] s = _s.toCharArray();
        char op = '+'; // 因为这题没有括号,我们明显知道乘除的优先级是大于加减的,因此不必用一个栈来存储符号,用一个字符即可
        int i = 0,n = s.length; // 遍历字符串的变量 i 以及字符数组 s 的长度 n

        // 开始遍历字符串
        while(i < n){
            // 首先先跳过空格
            if(s[i] == ' ') i++;
           else if (s[i] >= '0' && s[i] <= '9') {
                // 先把数字提取出来,用 tmp 临时存储一下数字
                int tmp = 0;
                while(i < n && s[i] <= '9' && s[i] >= '0'){ // 因为在提取字符时要让 i 移动,所以我们要保证 i 不越界以及这个字符是数字
                    tmp = tmp * 10 + (s[i] - '0');
                    i++;
                }

                // 接着分情况讨论
                if(op == '+') st.push(tmp);
                else if(op == '-') st.push(-tmp);
                else if(op == '*') st.push(st.pop() * tmp);
                else st.push(st.pop() / tmp);
            }else op = s[i++];
        }

        // while 循环结束后,st 存的就都是正数和负数了,我们要把栈中的元素取出来相加
        int sum = 0;
        for(int x : st) sum += x;
        
        return sum;
    }
}

在这里插入图片描述

1.4 字符串解码

题目链接:字符串解码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
    public String decodeString(String _s) {
        // 我们用两个 Stack 分别存储字符串和重复数字
        Stack<StringBuffer> st = new Stack<>(); // 存储字符串
        Stack<Integer> nums = new Stack<>(); // 存储重复次数
        st.push(new StringBuffer());; // 先往 st 中丢一个空字符串,方便处理边界情况
        char[] s = _s.toCharArray();
        int n = s.length, i = 0; // n 用于存储字符数组的长度, i 用于遍历字符数组

        while(i < n){
            if(s[i] >= '0' && s[i] <= '9'){  // 当 i 遇到数字时
                int tmp = 0; // 用 tmp 临时存储一下数字
                while(i < n && s[i] >= '0' && s[i] <= '9'){ // 因为 i 会加加,为了防止数组越界还是判断一下,并判断一下当前的字符加加后是不是还是数字
                    tmp = tmp * 10 + (s[i] - '0');
                    i++;
                }
                nums.push(tmp);

            }
            
            else if(s[i] == '['){ // 当 i 遇到了左括号时
                // 把左括号后面的字符提取出来,放入 st 中
                i++; // 先跳过字符'['
                StringBuffer tmp = new StringBuffer(); // 用于存储括号内的部分字符串
                while(s[i] >= 'a' && s[i] <= 'z'){
                    tmp.append(s[i]);
                    i++;
                }
                 // 当循环结束后,把 tmp 丢入 st 中
                st.push(tmp);
            } 
            
            else if(s[i] == ']'){ // 当 i 遇到了右括号时
                // 取出 st 中的字符串和 nums 中的数字进行解析,解析完后拼接在 st 栈顶元素的后面
                StringBuffer tmp = st.pop();
                int k = nums.pop();
                while(k > 0){
                    st.peek().append(tmp);
                    k--;
                }
                i++; // 跳过右括号
            }
            
            else{ // 遇到了普通的字符
                StringBuffer tmp = new StringBuffer(); // 临时存储连续的字母
                while (i < n && s[i] >= 'a' && s[i] <= 'z'){
                    tmp.append(s[i]);
                    i++;
                }
                 // 将提取的字母拼接到当前栈顶字符串中
                st.peek().append(tmp);
            }
        }
         
        // 返回最终拼接结果
        return st.peek().toString();
    }
}

在这里插入图片描述

1.5 验证栈序列

题目链接:验证栈序列

在这里插入图片描述
在这里插入图片描述

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        // 用 st 来记录已经入栈的信息
        Stack<Integer> st = new Stack<>();
        int i = 0, n = popped.length; // i 用来遍历 popped 数组,n 用来记录数组长度

        for(int x : pushed){
            // 先把元素丢进 st 中
            st.push(x);

            // 接着循环判断一下是否需要出栈,出栈要保证元素不为空
            while(st.isEmpty() == false && st.peek() == popped[i]){
                st.pop();
                i++;
            }
        }

        //循环结束后判断一下 i 是否等于 n 就可以了
        return i == n;

    }
}

在这里插入图片描述

二:队列+宽搜

2.1 N 叉树的层序遍历

题目链接:N 叉树的层序遍历
在这里插入图片描述
在这里插入图片描述

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        // 用 ret 存储最终的结果
        List<List<Integer>> ret = new ArrayList<>();
        // 用队列 q 来模拟层序遍历的过程
        Queue<Node> q = new LinkedList<>();

        // 如果根节点为空,直接返回空列表
        if (root == null) return ret;
        else q.add(root); // 先把根节点丢进去

        // 接下来开始循环了,只要队列不为空就一直循环
        while(!q.isEmpty()){
            // 首先用 sz 存储一下这一层有多少个元素
            int sz = q.size();
            List<Integer> tmp = new LinkedList<>(); // 用来临时存储这一层的 t.val 值
            for(int i = 0; i < sz; i++){
                Node t = q.poll();
                tmp.add(t.val);

                // 接着把 t 的子元素放进去
                for(Node child : t.children){
                    if (child != null) q.add(child);
                }
            }

            // 将当前层的节点值列表加入最终结果列表
            ret.add(tmp);
        }
         // 当循环结束后 ret 就存储着最终结果
         return ret;
    }
}

在这里插入图片描述

2.2 二叉树的锯齿形层序遍历

题目链接:二叉树的锯齿形层序遍历

在这里插入图片描述

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        // 用 ret 存储最终的结果,q 模拟程序遍历的过程
        List<List<Integer>> ret = new ArrayList<>();
        Queue<TreeNode> q = new LinkedList<>();
        int level = 1; // 用于标记当前的层数

        if(root == null) return ret; // 如果 root 为空,返回一个空的 ret
        else q.add(root);

        while(!q.isEmpty()){
            int sz = q.size();
            List<Integer> tmp = new LinkedList<>();
            for(int i = 0; i < sz; i++){
                TreeNode t = q.poll();
                tmp.add(t.val);

                if (t.left != null) q.add(t.left);
                if (t.right != null) q.add(t.right);
            }

            // 判断一下是否需要翻转
            if(level % 2 == 0)  Collections.reverse(tmp);
            ret.add(tmp);

            // 这一层结束后让 level 加一
            level++;
        }

        return ret;
    }
}

在这里插入图片描述

2.3 二叉树最大宽度

题目链接:二叉树最大宽度
在这里插入图片描述
在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int widthOfBinaryTree(TreeNode root) {
        // 用 List 模拟队列,pair 分别存储节点以及节点对应的编号
        List<Pair<TreeNode, Integer>> q = new ArrayList<>();
        // 因为 root 不为空,所以我们直接把 root 添加进去
        q.add(new Pair<TreeNode, Integer>(root, 1));
        int ret = 0; // 用 ret 记录最终的结果

        // 当这一层的队列不为空就继续循环直到这一层的队列元素为空
        while(!q.isEmpty()){
            // 先计算当前层级的最大宽度,并看看是否需要更新结果
            Pair<TreeNode, Integer> t1 = q.get(0); // 获取这层第一个节点
            Pair<TreeNode, Integer> t2 = q.get(q.size() - 1); // 获取这层的最后一个节点
            ret = Math.max(ret, t2.getValue() - t1.getValue() + 1);

            // 接着开始把下一层元素弄到 tmp 中,接着让 tmp 当下一层的 q 
            // 设置元素需要先获取当前元素的引用和索引
            List<Pair<TreeNode, Integer>> tmp = new ArrayList<>();
            for (Pair<TreeNode, Integer> t : q) {
                TreeNode node = t.getKey();
                int index = t.getValue();

                if (node.left != null) tmp.add(new Pair<TreeNode,Integer>(node.left, index * 2)); // 先处理左孩子
                if (node.right != null) tmp.add(new Pair<TreeNode,Integer>(node.right, index * 2 + 1)); // 再处理右孩子
            }

            // 循环结束后把 tmp 赋给 q,让他当下一层的 q
            q = tmp;
        }

        // 返回最大宽度
        return ret;
    }
}

在这里插入图片描述

2.4 在每个树行中找最大值

题目链接:在每个树行中找最大值

在这里插入图片描述

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> largestValues(TreeNode root) {
        // 用 ret 存储最终的结果
        List<Integer> ret = new ArrayList<>();
        Queue<TreeNode> q = new LinkedList<>();
        if(root == null) return ret;
        else q.add(root);

        while(!q.isEmpty()){
            int sz = q.size(), tmp = Integer.MIN_VALUE; //  先用 sz 记录一下这层的元素个数,tmp 记录这一层的最大值
            for(int i = 0; i < sz; i++){
               // 从队列中取出一个节点
                TreeNode t = q.poll();
                // 更新当前层的最大值
                tmp = Math.max(tmp, t.val);

                // 接着把这个节点的左右孩子添加进去
                if(t.left != null) q.add(t.left);
                if(t.right != null) q.add(t.right);
            }

            // 循环结束后把 tmp 存在 ret 中
            ret.add(tmp);
        }

        return ret;
    }
}

在这里插入图片描述

三:优先级队列

3.1 最后一块石头重量

题目链接:最后一块石头重量

在这里插入图片描述
在这里插入图片描述

class Solution {
    public int lastStoneWeight(int[] stones) {
        // 此处使用大根堆模拟解题过程
        PriorityQueue<Integer> heap = new PriorityQueue<>((a, b) -> b - a);
        
        // 接着把数组中的元素全丢入大根堆中
        for(int x : stones) heap.offer(x);

        while(heap.size() >= 2){
            int a = heap.poll();
            int b = heap.poll();
            if(a > b) heap.offer(a - b);
        }

        // 循环结束后如果大根堆还有元素就是最后的答案,没有元素返回 0
        return heap.isEmpty() ? 0 : heap.peek();
    }
}

在这里插入图片描述

3.2 数据流中的第 K 大元素

题目链接:数据流中的第 K 大元素

在这里插入图片描述
在这里插入图片描述

class KthLargest {
     // 创建一个大小为 k 的小根堆
    PriorityQueue<Integer> heap;
    // 存储 k 的值
    int _k;

    public KthLargest(int k, int[] nums) {
        // 干两件事,一是初始化 k,二是把 nums 中的元素放入堆中,最后用堆存储筛前 k 大的元素
        _k = k;
        heap = new PriorityQueue<>();
        for(int x : nums){
            heap.offer(x);
            if(heap.size() > _k) heap.poll();
        }  
    }
    
    public int add(int val) {
        heap.offer(val);
        if(heap.size() > _k) heap.poll();
        return heap.peek();
    }
}

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest obj = new KthLargest(k, nums);
 * int param_1 = obj.add(val);
 */

在这里插入图片描述

3.3 前 K 个高频单词

题目链接:前 K 个高频单词
在这里插入图片描述
在这里插入图片描述

class Solution {
    public List<String> topKFrequent(String[] words, int k) {
        // 先用一个哈希表统计一下 words 中字符串以及对应字符串出现的频率
        Map<String, Integer> hash = new HashMap<>();
        for(String s : words) hash.put(s, hash.getOrDefault(s, 0) + 1);

        // 接着创建一个堆,并初始化一个比较器,
        // 堆的排序规则:
        // - 频率低的单词排在前面(优先移除)。
        // - 如果频率相同,按字典序降序排列(为了保持正确的优先顺序)。
        PriorityQueue<Pair<String, Integer>> heap = new PriorityQueue<>(
            (a, b) -> {
                if(a.getValue().equals(b.getValue())) return b.getKey().compareTo(a.getKey()); // 如果出现次数相同就按照字符序降序比较
                else return a.getValue() - b.getValue(); // 按照频率顺序比较
            }
        );

        // 接下来开始循环,把 words 中的元素都丢入堆中,同时保持堆的大小为 k
         for (Map.Entry<String, Integer> e : hash.entrySet()) {
            heap.offer(new Pair<>(e.getKey(), e.getValue()));
            if(heap.size() > k) heap.poll();
         }

        // 4. 提取结果
        List<String> ret = new ArrayList<>();
        while(!heap.isEmpty()) 
            ret.add(heap.poll().getKey());

         // 因为堆的顺序是从低频到高频,结果需要逆序
        Collections.reverse(ret);

        // 返回结果
        return ret;
    }
}

在这里插入图片描述

3.4 数据流中的中位数

题目链接:数据流中的中位数

在这里插入图片描述
在这里插入图片描述

class MedianFinder {
    // 使用两个堆来管理数据流
    PriorityQueue<Integer> left; // 大根堆,存储较小的一半元素
    PriorityQueue<Integer> right; // 小根堆,存储较大的一半元素

            // 初始化两个堆
    public MedianFinder() {
        left = new PriorityQueue<>((a, b) -> b - a); // 大堆,从大到小排序
        right = new PriorityQueue<>((a, b) -> a - b); // 小堆,从小到大排序
    }
    
    // 添加数字
    public void addNum(int num) {
        // 分情况讨论,首先看看两个堆的关系,是 m == n 还是 m == n+1
        if(left.size() == right.size()){ //  m == n 
            if(left.isEmpty() || num <= left.peek()) left.offer(num);
            else{right.offer(num); left.offer(right.poll());}
        }else{ // m == n+1
            if(num <= left.peek()){left.offer(num); right.offer(left.poll());}
            else right.offer(num);
        }
    }
    
    // 返回当前数据流的中位数
    public double findMedian() {
        if(left.size() == right.size()) return  (left.peek() + right.peek()) / 2.0;
        else return left.peek();
    }
}

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder obj = new MedianFinder();
 * obj.addNum(num);
 * double param_2 = obj.findMedian();
 */

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【linux012】文件操作命令篇 - more 命令

文章目录 more 命令1、基本用法2、常见选项3、交互式键盘命令4、举例5、注意事项 more 命令 more 是 Linux 中的一个分页查看命令&#xff0c;用于逐屏显示文件内容。它特别适合用于查看较长的文件&#xff0c;与 cat 不同&#xff0c;more 不会一次性输出所有内容&#xff0c…

企业BI工具如何选择?主流5款BI工具多维对比

数据大爆炸时代&#xff0c;企业数据爆发式增长&#xff0c;来自产品、运营、价值链以及外部的数据都成指数级增长趋势。利用大数据分析实现精细化运营&#xff0c;驱动业务增长是企业的理想蓝图。而BI工具能够整合、分析并可视化复杂的数据集&#xff0c;帮助管理层和决策者快…

Qt 5.6.3 手动配置 mingw 环境

- 安装 qt 5.6.3 mingw 版 - 打开 qt creator - 找到选项 工具 - 选项- 构建和运行 - 找到 “编译器” 选项卡 ,点击 "添加" “编译器路径” 设置为 qt 安装目录下&#xff0c; tool 文件夹内的 g.exe 设置完成后&#xff0c;点击 "apply" ,使选项生…

linux使用scp和密钥在不同服务器传输文件

将源服务密钥中公钥&#xff08;以pub结尾的&#xff09;复制或拷贝密文&#xff0c;粘贴到目标服务器中的/root/.ssh/authorized_keys文件中&#xff1b; 测试连接&#xff1a;ssh -p2129 root172.129.162.537&#xff0c;如果使用默认端口22 -p参数可省略&#xff0c;注意这…

德克萨斯扑克(德扑)笔记

文章目录 比牌方法(大小)发牌下注位置一些牌面的简称QT是什么意思89s是什么意思AT是什么意思ATs是什么意思 89o是什么意思 其他术语Action 叫注/说话 - 一个玩家的决定Betting Rounds 押注圈其他术语 团建或和小伙伴聚会的时候经常玩德扑&#xff0c;一是凑手&#xff0c;二是聚…

[ 网络安全介绍 5 ] 为什么要学习网络安全?

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

C++: string(二)

✨✨ 欢迎大家来到我的文章✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 分类专栏&#xff1a;c 我的主页&#xff1a;tyler s blog 文章目录 一 string的成员函数1 insert2 resize3assign4erase5replace6 find(1) find(2)rfind…

鸿蒙应用权限控制与位置服务(Location Kit)

11_11日学习笔记 文章目录 [toc] 一、应用权限管控授权方式分类&#xff1a;1、[system_grant&#xff08;系统授权&#xff09;](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/permissions-for-all-V5#system_grant系统授权权限列表)2、[user_grant&…

Ubuntu 18 EDK2 环境编译

视频&#xff1a;在全新的Ubuntu上从零搭建UEFI的EDK2开发环境 开始&#xff1a;git clone https://github.com/tianocore/edk2.git 开始编译BaseTools前先更新一下子模块&#xff1a;git submodule update --init &#xff0c;然后&#xff1a;make -C BaseTools/ 问题1&a…

网络安全SQL初步注入2

六.报错注入 mysql函数 updatexml(1,xpath语法,0) xpath语法常用concat拼接 例如: concat(07e,(查询语句),07e) select table_name from information_schema.tables limit 0,1 七.宽字节注入(如果后台数据库的编码为GBK) url编码:为了防止提交的数据和url中的一些有特殊意…

Git 搭建远程仓库、在 IDEA 工具中的配置和使用

Git的概念、安装、操作与分支管理和图形化界面TortoiseGit&#xff08;小乌龟 &#xff09;的安装与使用-CSDN博客 目录 一、远程仓库 1&#xff09;在github上创建仓库 2&#xff09;在gitee上创建项目 3&#xff09;如何将远程的项目clone 到本地 4&#xff09;公司自己…

自然语言处理技术之细粒度实体识别

细粒度实体识别(Fine-Grained Named Entity Recognition, FG-NER) 1. 概述 细粒度实体识别是自然语言处理(NLP)领域中的一个重要研究方向,其目标是从文本中识别出更加具体和详细的实体类型。相比于传统的实体识别(NER),细粒度实体识别不仅关注常见的实体类别(如 人名…

k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储

文章目录 [toc]docker registry 部署生成 htpasswd 文件生成 secret 文件 生成 registry 配置文件创建 service创建 statefulset创建 ingress验证 docker registry docker registry 监控docker registry ui docker registry dockerfile docker registry 配置文件 S3 storage dr…

为什么要使用Ansible实现Linux管理自动化?

自动化和Linux系统管理 多年来&#xff0c;大多数系统管理和基础架构管理都依赖于通过图形或命令行用户界面执行的手动任务。系统管理员通常使用清单、其他文档或记忆的例程来执行标准任务。 这种方法容易出错。系统管理员很容易跳过某个步骤或在某个步骤上犯错误。验证这些步…

一文了解Android的核心系统服务

在 Android 系统中&#xff0c;核心系统服务&#xff08;Core System Services&#xff09;是应用和系统功能正常运行的基石。它们负责提供系统级的资源和操作支持&#xff0c;包含了从启动设备、管理进程到提供应用基础组件的方方面面。以下是 Android 中一些重要的核心系统服…

MATLAB向量元素的引用

我们定义一个向量后&#xff0c;如果想引用的话&#xff0c;可以通过索引 i n d ind ind来实现。 注意&#xff1a;MATLAB中向量的开始索引是1&#xff0c;与许多编程语言不同。 例如&#xff1a; 如果想引用多个的话&#xff0c;可以用索引 i n d ind ind来提取多个位置 例如…

让空间计算触手可及,VR手套何以点石成金?

引言 如何让一位母亲与她去世的小女儿“重逢”&#xff1f;韩国MBC电视台《I Met You》节目实现了一个“不可能”心愿。 在空旷的绿幕中&#xff0c;母亲Jang Ji-sung透过VR头显&#xff0c;看到了三年前因白血病去世的女儿Nayeon。当她伸出双手&#xff0c;居然能摸到女儿的…

paramiko 库实现的暴力破解 SSH 密码

import paramiko import optparse import threading import time from threading import Thread, BoundedSemaphore# 用paramiko暴力破解SSH密码 # 最大并发连接尝试的数量&#xff0c;可根据实际情况调整&#xff0c;适当减小可降低对目标服务器的压力以及减少多线程同步问题出…

用 Python 从零开始创建神经网络(五):损失函数(Loss Functions)计算网络误差

用损失函数&#xff08;Loss Functions&#xff09;计算网络误差 引言1. 分类交叉熵损失&#xff08;Categorical Cross-Entropy Loss&#xff09;2. 分类交叉熵损失类&#xff08;The Categorical Cross-Entropy Loss Class&#xff09;展示到目前为止的所有代码3. 准确率计算…

RabbitMQ的工作队列在Spring Boot中实现(详解常⽤的⼯作模式)

上文着重介绍RabbitMQ 七种工作模式介绍RabbitMQ 七种工作模式介绍_rabbitmq 工作模式-CSDN博客 本篇讲解如何在Spring环境下进⾏RabbitMQ的开发.&#xff08;只演⽰部分常⽤的⼯作模式&#xff09; 目录 引⼊依赖 一.工作队列模式 二.Publish/Subscribe(发布订阅模式) …