当前位置: 首页 > news >正文

【2024年华为OD机试】(A卷,100分)- 打印机队列(Java JS PythonC/C++)

在这里插入图片描述

一、问题描述

题目描述

有5台打印机打印文件,每台打印机有自己的待打印队列。

因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中数字越大优先级越高。

打印机会从自己的待打印队列中选择优先级最高的文件来打印。

如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。

现在请你来模拟这5台打印机的打印过程。

输入描述

每个输入包含1个测试用例,

每个测试用例第一行给出发生事件的数量N(0 < N < 1000)。

接下来有 N 行,分别表示发生的事件。共有如下两种事件:

  • “IN P NUM”,表示有一个拥有优先级 NUM 的文件放到了打印机 P 的待打印队列中。(0< P <= 5, 0 < NUM <= 10);
  • “OUT P”,表示打印机 P 进行了一次文件打印,同时该文件从待打印队列中取出。(0 < P <= 5)。

输出描述

对于每个测试用例,每次”OUT P”事件,请在一行中输出文件的编号。
如果此时没有文件可以打印,请输出”NULL“。
文件的编号定义为”IN P NUM”事件发生第 x 次,此处待打印文件的编号为x。编号从1开始。

用例

输入

7
IN 1 1
IN 1 2
IN 1 3
IN 2 1
OUT 1
OUT 2
OUT 2

输出

3
4
NULL

说明

输入

5
IN 1 1
IN 1 3
IN 1 1
IN 1 3
OUT 1

输出

2

说明

题目解析

本题可以基于优先队列实现打印机总是打印优先级最高的文件。

优先队列,如果想简单一点的话,则可以基于有序数组实现,但是有序数组是整体有序,每次有新任务入队,都需要O(n)时间复杂度维持。

优先队列最好是基于堆结构实现,所谓堆结构,即一颗完全二叉树。本题是优先级数值越大,优先级越高,因此我们可以使用大顶堆。

二、JavaScript算法源码

以下是基于有序数组实现优先队列的 JavaScript 代码的中文详细注释和逻辑讲解:


代码逻辑

// 引入 readline 模块,用于从控制台读取输入
const readline = require("readline");// 创建 readline 接口
const rl = readline.createInterface({input: process.stdin,  // 输入流为标准输入output: process.stdout, // 输出流为标准输出
});// 存储输入行的数组
const lines = [];
let n; // 存储任务的总数// 监听输入事件
rl.on("line", (line) => {lines.push(line); // 将每一行输入存入 lines 数组// 如果输入的第一行是任务总数 nif (lines.length === 1) {n = parseInt(lines[0]); // 解析 n 为整数}// 如果输入的行数等于 n + 1(任务总数 + 任务内容)if (n && lines.length === n + 1) {lines.shift(); // 移除第一行(任务总数)// 将剩余的行解析为任务数组const tasks = lines.map((line) => line.split(" "));// 调用算法函数处理任务getResult(tasks);// 清空 lines 数组,准备接收下一组输入lines.length = 0;}
});// 算法函数
function getResult(tasks) {// 使用对象存储每个打印机的任务队列const print = {};// 任务 ID,用于标识每个任务的唯一性let taskId = 1;// 遍历所有任务for (let i = 0; i < tasks.length; i++) {// 解析当前任务的类型、打印机 ID 和优先级const [type, printId, priority] = tasks[i];// 如果是 "IN" 操作(添加任务)if (type === "IN") {// 创建一个任务数组,包含任务 ID、优先级和任务顺序const arr = [taskId, priority, i]; // i 是先来后到的顺序// 如果当前打印机 ID 不存在,初始化一个空数组if (!print[printId]) {print[printId] = []; // 基于数组实现优先队列}// 将任务添加到对应打印机的任务队列中print[printId].push(arr);// 对任务队列进行排序,维持高优先级在头部// 如果优先级相同,则按先来后到的顺序排序print[printId].sort((a, b) => (a[1] != b[1] ? b[1] - a[1] : a[2] - b[2]));// 任务 ID 自增taskId++;}// 如果是 "OUT" 操作(取出任务)else {// 如果当前打印机 ID 不存在或任务队列为空,输出 "NULL"if (!print[printId] || print[printId].length == 0) {console.log("NULL");}// 否则,取出队列中的第一个任务并输出任务 IDelse {const arr = print[printId].shift(); // 移除队列中的第一个任务console.log(arr ? arr[0] : "NULL"); // 输出任务 ID}}}
}

代码讲解

  1. 输入处理

    • 使用 readline 模块从控制台读取输入。
    • 第一行输入为任务总数 n
    • 后续 n 行输入为任务内容,每行包含任务类型(INOUT)、打印机 ID 和优先级(仅 IN 操作需要)。
  2. 任务队列存储

    • 使用对象 print 存储每个打印机的任务队列。
    • 每个打印机的任务队列是一个数组,数组中的每个元素是一个任务,包含任务 ID、优先级和任务顺序。
  3. 任务添加(IN 操作)

    • 解析任务内容,生成任务数组 [taskId, priority, i],其中:
      • taskId:任务的唯一标识。
      • priority:任务的优先级。
      • i:任务的顺序(先来后到)。
    • 将任务添加到对应打印机的任务队列中。
    • 对任务队列进行排序,优先级高的任务排在前面。如果优先级相同,则按任务顺序排序。
  4. 任务取出(OUT 操作)

    • 检查对应打印机的任务队列是否为空。
    • 如果队列为空,输出 "NULL"
    • 如果队列不为空,取出队列中的第一个任务并输出任务 ID。
  5. 任务 ID 管理

    • 使用 taskId 变量为每个任务分配唯一的 ID,确保任务的唯一性。
  6. 排序逻辑

    • 使用 sort 方法对任务队列进行排序:
      • 优先级高的任务排在前面(b[1] - a[1])。
      • 如果优先级相同,则按任务顺序排序(a[2] - b[2])。

示例解析

输入
5
IN 1 10
IN 1 20
OUT 1
IN 1 30
OUT 1
运行结果
2
3
  • 解析:
    • 第 1 个任务:IN 1 10,任务 ID 为 1,优先级为 10。
    • 第 2 个任务:IN 1 20,任务 ID 为 2,优先级为 20。
    • 第 3 个任务:OUT 1,取出打印机 1 的任务队列中的第一个任务(优先级最高),输出任务 ID 2
    • 第 4 个任务:IN 1 30,任务 ID 为 3,优先级为 30。
    • 第 5 个任务:OUT 1,取出打印机 1 的任务队列中的第一个任务(优先级最高),输出任务 ID 3

总结

  • 该代码基于有序数组实现了优先队列,支持任务的添加和取出操作。
  • 通过排序逻辑,确保高优先级任务优先处理,同时支持任务顺序的优先级。
  • 适用于需要动态管理任务队列的场景,如打印机任务调度等。

如果有其他问题,欢迎随时提问!

三、Java算法源码

以下是基于 Java 的 PriorityQueue 实现优先队列的代码的中文详细注释和逻辑讲解:


代码逻辑

import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.Scanner;public class Main {public static void main(String[] args) {// 创建 Scanner 对象,用于从控制台读取输入Scanner sc = new Scanner(System.in);// 读取任务总数 nint n = Integer.parseInt(sc.nextLine());// 定义二维数组 tasks,用于存储所有任务String[][] tasks = new String[n][];// 读取 n 行任务内容,并存入 tasks 数组for (int i = 0; i < n; i++) {String[] s = sc.nextLine().split(" "); // 将每行输入按空格分割tasks[i] = s; // 存入 tasks 数组}// 调用算法函数处理任务getResult(tasks);}public static void getResult(String[][] tasks) {// 使用 HashMap 存储每台打印机的等待队列// key: 打印机 ID,value: 优先队列(存储打印任务)HashMap<String, PriorityQueue<int[]>> print = new HashMap<>();// 文件编号,从 1 开始int x = 1;// 遍历所有任务for (int i = 0; i < tasks.length; i++) {// 获取当前任务String[] task = tasks[i];// 解析任务类型(IN 或 OUT)和打印机 IDString type = task[0];String printId = task[1];// 如果是 "IN" 操作(添加任务)if ("IN".equals(type)) {// 解析任务的优先级String priority = task[2];// 创建打印任务数组,包含文件编号、优先级和任务顺序int[] arr = {x, Integer.parseInt(priority), i}; // i 代表先来后到的顺序// 如果当前打印机 ID 不存在,初始化一个优先队列print.putIfAbsent(printId,new PriorityQueue<>((a, b) ->a[1] != b[1] ? b[1] - a[1] : a[2] - b[2])); // 优先按优先级排序,如果优先级相同,按任务顺序排序// 将打印任务加入对应打印机的优先队列print.get(printId).offer(arr);// 文件编号自增x++;}// 如果是 "OUT" 操作(取出任务)else {// 检查当前打印机的等待队列是否为空if (!print.containsKey(printId) || print.get(printId).isEmpty()) {// 如果队列为空,输出 "NULL"System.out.println("NULL");} else {// 取出队列中优先级最高的任务int[] arr = print.get(printId).poll();// 输出任务的文件编号if (arr != null) System.out.println(arr[0]); // arr[0] 是文件编号 xelse System.out.println("NULL");}}}}
}

代码讲解

  1. 输入处理

    • 使用 Scanner 从控制台读取输入。
    • 第一行输入为任务总数 n
    • 后续 n 行输入为任务内容,每行包含任务类型(INOUT)、打印机 ID 和优先级(仅 IN 操作需要)。
  2. 任务队列存储

    • 使用 HashMap 存储每台打印机的任务队列。
    • HashMap 的 key 是打印机 ID,value 是一个优先队列(PriorityQueue),用于存储打印任务。
  3. 任务添加(IN 操作)

    • 解析任务内容,生成任务数组 [x, priority, i],其中:
      • x:文件编号,唯一标识任务。
      • priority:任务的优先级。
      • i:任务的顺序(先来后到)。
    • 如果当前打印机 ID 不存在,初始化一个优先队列,并设置排序规则:
      • 优先级高的任务排在前面(b[1] - a[1])。
      • 如果优先级相同,则按任务顺序排序(a[2] - b[2])。
    • 将任务添加到对应打印机的优先队列中。
  4. 任务取出(OUT 操作)

    • 检查对应打印机的任务队列是否为空。
    • 如果队列为空,输出 "NULL"
    • 如果队列不为空,取出队列中优先级最高的任务,并输出任务的文件编号。
  5. 文件编号管理

    • 使用变量 x 为每个任务分配唯一的文件编号,确保任务的唯一性。
  6. 优先队列排序规则

    • 优先队列的排序规则通过 Comparator 实现:
      • 优先级高的任务排在前面。
      • 如果优先级相同,则按任务顺序排序。

示例解析

输入
5
IN 1 10
IN 1 20
OUT 1
IN 1 30
OUT 1
运行结果
2
3
  • 解析:
    • 第 1 个任务:IN 1 10,文件编号为 1,优先级为 10。
    • 第 2 个任务:IN 1 20,文件编号为 2,优先级为 20。
    • 第 3 个任务:OUT 1,取出打印机 1 的任务队列中的第一个任务(优先级最高),输出文件编号 2
    • 第 4 个任务:IN 1 30,文件编号为 3,优先级为 30。
    • 第 5 个任务:OUT 1,取出打印机 1 的任务队列中的第一个任务(优先级最高),输出文件编号 3

总结

  • 该代码基于 Java 的 PriorityQueue 实现了优先队列,支持任务的添加和取出操作。
  • 通过自定义排序规则,确保高优先级任务优先处理,同时支持任务顺序的优先级。
  • 适用于需要动态管理任务队列的场景,如打印机任务调度等。

如果有其他问题,欢迎随时提问!

四、Python算法源码

以下是基于 Python 的 queue.PriorityQueue 实现优先队列的代码的中文详细注释和逻辑讲解:


代码逻辑

import queue# 输入获取
n = int(input())  # 读取任务总数 ntasks = []  # 定义列表 tasks,用于存储所有任务
for i in range(n):tasks.append(input().split())  # 读取每行任务内容,并存入 tasks 列表# 定义 Task 类,用于表示打印任务
class Task:def __init__(self, taskId, priority, index):"""构造函数,初始化任务对象:param taskId: 任务 ID:param priority: 任务优先级:param index: 任务到达顺序"""self.taskId = taskIdself.priority = priorityself.index = indexdef __lt__(self, other):"""重载小于运算符,定义任务的排序规则:param other: 另一个任务对象:return: 当前任务是否优先于另一个任务"""if self.priority != other.priority:return self.priority > other.priority  # 优先级高的任务优先else:return self.index < other.index  # 如果优先级相同,按任务到达顺序排序# 算法入口
def getResult(tasks):# 使用字典 printer 存储每台打印机的任务队列# key: 打印机 ID,value: 优先队列(存储 Task 对象)printer = {}# 任务 ID,从 1 开始taskId = 1# 遍历所有任务for i in range(len(tasks)):task = tasks[i]  # 获取当前任务# 解析任务类型(IN 或 OUT)和打印机 IDtype = task[0]printerId = task[1]# 如果是 "IN" 操作(添加任务)if type == "IN":# 解析任务的优先级priority = task[2]# 如果当前打印机 ID 不存在,初始化一个优先队列if printer.get(printerId) is None:printer[printerId] = queue.PriorityQueue()# 创建 Task 对象,表示当前任务t = Task(taskId, int(priority), i)# 将任务加入对应打印机的优先队列printer[printerId].put(t)# 任务 ID 自增taskId += 1# 如果是 "OUT" 操作(取出任务)else:# 检查当前打印机的任务队列是否为空if printer.get(printerId) is None or printer[printerId].qsize() == 0:# 如果队列为空,输出 "NULL"print("NULL")else:# 取出队列中优先级最高的任务t = printer[printerId].get()# 输出任务的任务 IDprint(t.taskId)# 调用算法函数处理任务
getResult(tasks)

代码讲解

  1. 输入处理

    • 使用 input() 函数从控制台读取输入。
    • 第一行输入为任务总数 n
    • 后续 n 行输入为任务内容,每行包含任务类型(INOUT)、打印机 ID 和优先级(仅 IN 操作需要)。
  2. 任务队列存储

    • 使用字典 printer 存储每台打印机的任务队列。
    • 字典的 key 是打印机 ID,value 是一个优先队列(queue.PriorityQueue),用于存储 Task 对象。
  3. 任务添加(IN 操作)

    • 解析任务内容,创建 Task 对象,包含任务 ID、优先级和任务顺序。
    • 如果当前打印机 ID 不存在,初始化一个优先队列。
    • 将任务添加到对应打印机的优先队列中。
  4. 任务取出(OUT 操作)

    • 检查对应打印机的任务队列是否为空。
    • 如果队列为空,输出 "NULL"
    • 如果队列不为空,取出队列中优先级最高的任务,并输出任务的任务 ID。
  5. 任务排序规则

    • Task 类中重载 __lt__ 方法,定义任务的排序规则:
      • 优先级高的任务优先(self.priority > other.priority)。
      • 如果优先级相同,则按任务到达顺序排序(self.index < other.index)。
  6. 任务 ID 管理

    • 使用变量 taskId 为每个任务分配唯一的任务 ID,确保任务的唯一性。

示例解析

输入
5
IN 1 10
IN 1 20
OUT 1
IN 1 30
OUT 1
运行结果
2
3
  • 解析:
    • 第 1 个任务:IN 1 10,任务 ID 为 1,优先级为 10。
    • 第 2 个任务:IN 1 20,任务 ID 为 2,优先级为 20。
    • 第 3 个任务:OUT 1,取出打印机 1 的任务队列中的第一个任务(优先级最高),输出任务 ID 2
    • 第 4 个任务:IN 1 30,任务 ID 为 3,优先级为 30。
    • 第 5 个任务:OUT 1,取出打印机 1 的任务队列中的第一个任务(优先级最高),输出任务 ID 3

总结

  • 该代码基于 Python 的 queue.PriorityQueue 实现了优先队列,支持任务的添加和取出操作。
  • 通过重载 __lt__ 方法,定义任务的排序规则,确保高优先级任务优先处理,同时支持任务顺序的优先级。
  • 适用于需要动态管理任务队列的场景,如打印机任务调度等。

如果有其他问题,欢迎随时提问!

五、C/C++算法源码:

以下是基于 C++ 的 priority_queue 实现优先队列的代码的中文详细注释和逻辑讲解:


代码逻辑

#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <sstream>
using namespace std;// 任务类
class Task {
public:int taskId;    // 任务IDint priority;  // 任务优先级int index;     // 任务到达顺序// 构造函数,初始化任务对象Task(int taskId, int priority, int index) : taskId(taskId), priority(priority), index(index) {}// 重载小于运算符,用于优先队列的比较bool operator<(const Task& other) const {if (priority != other.priority) {return priority < other.priority; // 优先级高的排在前面} else {return index > other.index; // 优先级相同,先到的排在前面}}
};// 输入获取
int n;  // 任务总数
vector<vector<string>> tasks;  // 存储所有任务的二维数组void readInput() {cin >> n;  // 读取任务总数tasks.resize(n);  // 调整 tasks 的大小为 nfor (int i = 0; i < n; ++i) {string line;cin >> line;  // 读取每行任务内容stringstream ss(line);  // 使用字符串流分割任务内容string token;while (ss >> token) {tasks[i].push_back(token);  // 将分割后的任务内容存入 tasks}}
}// 算法入口
void getResult() {// 定义 6 个优先队列,分别对应 6 个打印机(编号 1-5)vector<priority_queue<Task>> printer(6);// 任务 ID,从 1 开始int taskId = 1;// 遍历所有任务for (int i = 0; i < n; ++i) {const vector<string>& task = tasks[i];  // 获取当前任务// 解析任务类型(IN 或 OUT)和打印机 IDstring type = task[0];int printerId = stoi(task[1]);// 如果是 "IN" 操作(添加任务)if (type == "IN") {// 解析任务的优先级int priority = stoi(task[2]);// 将任务加入对应打印机的优先队列printer[printerId].emplace(taskId, priority, i);// 任务 ID 自增taskId++;}// 如果是 "OUT" 操作(取出任务)else {// 检查当前打印机的任务队列是否为空if (printer[printerId].empty()) {// 如果队列为空,输出 "NULL"cout << "NULL" << endl;} else {// 取出队列中优先级最高的任务Task t = printer[printerId].top();printer[printerId].pop();// 输出任务的任务 IDcout << t.taskId << endl;}}}
}int main() {readInput();  // 读取输入getResult();  // 处理任务return 0;
}

代码讲解

  1. 输入处理

    • 使用 cin 从控制台读取输入。
    • 第一行输入为任务总数 n
    • 后续 n 行输入为任务内容,每行包含任务类型(INOUT)、打印机 ID 和优先级(仅 IN 操作需要)。
    • 使用 stringstream 分割每行任务内容,并存入二维数组 tasks
  2. 任务队列存储

    • 使用 vector<priority_queue<Task>> 存储 6 个打印机的任务队列(编号 1-5)。
    • 每个优先队列(priority_queue)存储 Task 对象。
  3. 任务添加(IN 操作)

    • 解析任务内容,创建 Task 对象,包含任务 ID、优先级和任务顺序。
    • 将任务加入对应打印机的优先队列中。
  4. 任务取出(OUT 操作)

    • 检查对应打印机的任务队列是否为空。
    • 如果队列为空,输出 "NULL"
    • 如果队列不为空,取出队列中优先级最高的任务,并输出任务的任务 ID。
  5. 任务排序规则

    • Task 类中重载 < 运算符,定义任务的排序规则:
      • 优先级高的任务优先(priority < other.priority)。
      • 如果优先级相同,则按任务到达顺序排序(index > other.index)。
  6. 任务 ID 管理

    • 使用变量 taskId 为每个任务分配唯一的任务 ID,确保任务的唯一性。

示例解析

输入
5
IN 1 10
IN 1 20
OUT 1
IN 1 30
OUT 1
运行结果
2
3
  • 解析:
    • 第 1 个任务:IN 1 10,任务 ID 为 1,优先级为 10。
    • 第 2 个任务:IN 1 20,任务 ID 为 2,优先级为 20。
    • 第 3 个任务:OUT 1,取出打印机 1 的任务队列中的第一个任务(优先级最高),输出任务 ID 2
    • 第 4 个任务:IN 1 30,任务 ID 为 3,优先级为 30。
    • 第 5 个任务:OUT 1,取出打印机 1 的任务队列中的第一个任务(优先级最高),输出任务 ID 3

总结

  • 该代码基于 C++ 的 priority_queue 实现了优先队列,支持任务的添加和取出操作。
  • 通过重载 < 运算符,定义任务的排序规则,确保高优先级任务优先处理,同时支持任务顺序的优先级。
  • 适用于需要动态管理任务队列的场景,如打印机任务调度等。

如果有其他问题,欢迎随时提问!

相关文章:

【2024年华为OD机试】(A卷,100分)- 打印机队列(Java JS PythonC/C++)

一、问题描述 题目描述 有5台打印机打印文件&#xff0c;每台打印机有自己的待打印队列。 因为打印的文件内容有轻重缓急之分&#xff0c;所以队列中的文件有1~10不同的代先级&#xff0c;其中数字越大优先级越高。 打印机会从自己的待打印队列中选择优先级最高的文件来打印…...

SQL语言的面向对象编程

SQL语言的面向对象编程 引言 随着数据库技术的发展&#xff0c;SQL&#xff08;结构化查询语言&#xff09;逐渐成为数据管理和处理的标准语言。从最初的查询语言演变为更复杂的系统&#xff0c;SQL 现在不仅帮助开发者执行基本的查询&#xff0c;还支持了许多高级功能&#…...

android分区和root

线刷包内容&#xff1a; 线刷包是一个完整的android镜像&#xff0c;不但包括android、linux和用户数据&#xff0c;还包括recovery等。当然此图中没有recovery,但是我们可以自己刷入一个。 主要分区 system.img 系统分区&#xff0c;包括linux下主要的二进制程序。 boot.img…...

WebScoket-服务器客户端双向通信

文章目录 1. 消息推送常用方式介绍2. WebSocket2.1 介绍2.2 客户端API2.3 服务端API 3. 总结 1. 消息推送常用方式介绍 轮询 浏览器以指定的时间间隔向服务器发出HTTP请求&#xff0c;服务器实时返回数据给浏览器。 长轮询 浏览器发出ajax请求&#xff0c;服务器端接收到请求…...

如何在QT中保证线程是安全的?

在Qt中保证线程安全是一个重要的问题&#xff0c;尤其是在涉及多线程编程时。以下是一些保证线程安全的方法和策略&#xff1a; 1. 使用信号和槽机制 Qt的信号和槽机制本身提供了线程间的安全通信方式。当信号从一个线程发射到另一个线程时&#xff0c;槽函数会在接收信号的线…...

Lock接口

java.util.concurrent.locks.Lock 接口是Java并发包中的一部分&#xff0c;它提供了比内置锁&#xff08;即 synchronized 关键字&#xff09;更灵活和强大的锁机制。通过使用 Lock 接口及其相关实现类&#xff0c;开发者可以获得更多的功能选项来控制线程间的同步行为&#xf…...

02——变量

变量 1、变量的概念 用于存储数据 2、创建变量 变量名 变量值 变量必须先定义再使用 两边要留一个空格 3、变量的修改 创建变量后&#xff0c;可以在代码中重新赋值。 #不同类型变量也可以直接修改 money 十元 money 10 print(money)结果&#xff1a;10 4、变量的…...

MonacoEditor在vue3 element-plus的tabs非默认激活标签页中无法正常显示的问题

现象 在使用 el-tabs 组件时&#xff0c;如果 MonacoEditor 放在非默认激活的标签页中&#xff0c;可能会遇到初始化问题&#xff0c;导致 MonacoEditor 无法正常显示。这是因为 MonacoEditor 在初始化时需要一个可见的容器&#xff0c;而未激活的标签页在初始状态下是不可见的…...

【RedisStack】Linux安装指南

【RedisStack】Linux安装指南.md 前言下载解压创建启动文件设置密码把密码设置到环境变量启动/停止相关命令测试&验证官网资料参考资料 前言 Redis Stack是使用Redis的最佳起点。我们将我们必须提供的最好的技术捆绑在一起&#xff0c;形成一个易于使用的软件包。Redis St…...

说一说mongodb组合索引的匹配规则

一、背景 有一张1000多万条记录的大表&#xff0c;需要做归档至历史表&#xff0c;出现了大量慢查询。 查询条件是 "classroomId": {$in: ["xxx", "xxx", ..... "xxx","xxx", "xxx" ] }耗时近5秒&#xff0c;且…...

Maven核心插件之maven-resources-plugin

前言 Maven 插件是 Maven 构建系统的重要组成部分&#xff0c;它们为 Maven 提供了丰富的功能和扩展能力&#xff0c;使得 Maven 不仅是一个构建工具&#xff0c;更是一个强大的项目管理平台。在 Maven 项目中&#xff0c;插件的使用通常通过配置 pom.xml 文件来完成。每个插件…...

C++ 鼠标轨迹算法 - 防止游戏检测

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…...

网络学习记录6

查找下一跳和流量如何通过&#xff0c;是网络路由的基本概念。下面我会尽量用通俗易懂的方式来解释这个过程。 查找下一跳 数据包的目的地&#xff1a;当一个数据包在网络中传输时&#xff0c;它的目标是一个特定的IP地址。 路由表的作用&#xff1a;路由器有一个叫做路由表的东…...

【数学】概率论与数理统计(四)

文章目录 [toc] 分布函数分布函数性质离散型随机变量的分布函数连续型随机变量的分布函数示例1问题解答 正态随机变量示例问题解答 示例2问题&#xff08;1&#xff09;&#xff08;2&#xff09; 解答&#xff08;1&#xff09;&#xff08;2&#xff09; 随机变量函数的分布离…...

小结:华为交换机常用的操作指令

以下是华为交换机常用的操作指令总结&#xff0c;按功能分类说明&#xff1a; 1. 系统管理 进入系统视图system-view返回用户视图quit保存配置save查看当前配置display current-configuration重启设备reboot2. 用户管理 配置用户密码local-user <username> password ir…...

轻松学51单片机--基于普中科技开发板练习蓝桥杯及机器人大赛等(8-DS1302实时时钟)

1、DS1302 DS1302是一款实时时钟芯片&#xff0c;可以用于实时计时和日期显示等应用。它具有低功耗、精度高、芯片体积小等特点&#xff0c;非常适合嵌入式系统和小型电子设备中使用。 DS1302具有多个功能和特性&#xff0c;包括&#xff1a; 时钟功能&#xff1a;可以显示年…...

《Java核心技术II》并行流

并行流 从集合中获取并行流&#xff1a;Stream paralleWords words.parallelStream(); parallel方法将任意顺序流转换为并行流&#xff1a;Stream paralleWords Stream.of(wordArray).parallel(); 以下是不好的示范&#xff0c;假设对字符串的所有短单词计数&#xff1a; …...

Vue 3前端与Python(Django)后端接口简单示例

项目 后端&#xff08;Django&#xff09;前端&#xff08;Vue 3&#xff09; 后端&#xff08;Django&#xff09; 创建Django项目和应用&#xff1a; 确保你已经安装了Django。如果没有安装&#xff0c;可以使用以下命令安装&#xff1a; pip install django创建一个新的Dja…...

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(二)

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…...

STM32和国民技术(N32)单片机串口中断接收数据及数据解析

一、串口配置 根据单片机不同&#xff0c;串口IO口配置也不同&#xff0c;像STM32单片机&#xff0c;RX脚可以配置为复用输出&#xff0c;也可以配置为浮空输入模式。但是国民技术单片机&#xff08;N32&#xff09;的RX是不能配置为复用输出模式的&#xff0c;这样是收不到数…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...