算法 - 二分法 / 双指针 / 三指针 / 滑动窗口
文章目录
- 🍺 二分法
- 🍻 旋转数组
- 🥂 33. 搜索旋转排序数组 [旋转数组] [目标值] (二分法)
- 🍻 元素边界
- 🥂 34. 在排序数组中查找元素的第一个和最后一个位置 [有序数组] > [元素边界] > (二分法)
- 🥂 81. 搜索旋转排序数组Ⅱ [旋转数组] [有重] [目标值] (二分法)
- 🥂 153. 寻找旋转排序数组中的最小值 [旋转数组] [最小值] (二分法)
- 🍺 双指针
- 🍻 元素合并
- 🥂 21. 合并两个有序链表 [有序链表] [合并] (双指针) (归并)
- 🍻 元素交换
- 🥂 LCR 139. 训练计划 I [数组] [元素交换] (双指针)
- 🍻 元素相交
- 🥂 142. 环形链表II [链表] > [环] > (双指针)
- 🥂 160. 相交链表 [链表] > [相交] > (双指针)
- 🍻 面积
- 🥂 11. 盛最多水的容器 [数组] [面积] (双指针)
- 🥂 42. 接雨水 [数组] [面积] (双指针)
- 🥂 其他
- 🥂 31. 下一个排列 [数组] [排列] (双指针) (推导)
- 🍺 三指针
- 🍻 链表反转
- 🥂 25. K 个一组翻转链表 [链表] [分组反转] (三指针)
- 🥂 92. 反转链表II [链表] [反转] (三指针)
- 🥂 206. 反转链表 [链表] [反转] (三指针)
- 🍻 快速排序
- 🥂 215. 数组中的第K个最大元素 [数组] [第K大元素] (三指针) (快速排序)
- 🥂 912. 排序数组 [数组] [排序] (三指针) (快速排序)
- 🍺 滑动窗口
- 🍻 子串
- 🥂 3. 无重复字符的最长子串 [字符串] [子串] (滑动窗口)
- 🍻 区间和
- 🥂 1423. 可获得的最大点数 [数组] > [区间外最大值] > [区间内最小值] > (定长滑动窗口)
🍺 二分法
🍻 旋转数组
🥂 33. 搜索旋转排序数组 [旋转数组] [目标值] (二分法)
class Solution {
public:int search(vector<int>& nums, int target) {int n = nums.size();int left = 0, right = n - 1;// 二分法while (left <= right) {int mid = left + (right - left) / 2;// 先判断找到目标了没if (nums[mid] == target) return mid;// 再继续左右两边找, nums[mid] < nums[0] 说明 mid 在右边if (nums[mid] <= nums[0]) {// 此时 target 处于右右边if (nums[mid] < target && target <= nums[n - 1]) {left = mid + 1; // 右右} else {right = mid - 1; // 右左}} else {if (nums[0] <= target && target < nums[mid]) {right = mid - 1; // 左左} else {left = mid + 1; // 左右}}}return -1;}
};
🍻 元素边界
🥂 34. 在排序数组中查找元素的第一个和最后一个位置 [有序数组] > [元素边界] > (二分法)
// [有序数组] > [查找元素边界] > (二分法)
class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {int left = find_l(nums, target);int right = find_r(nums,target);return {left, right};}// 二分法查找左边界 [left, right]int find_l(vector<int>& nums, int target) {int n = nums.size();int left = 0, right = n - 1;while (left <= right) {// [left, mid - 1] [mid] [mid + 1, right]int mid = left + (right - left) / 2;if (nums[mid] >= target) {right = mid - 1;} else {left = mid + 1;}}// left = 3, right = 3 - 1 = 2if (0 <= left && left < n && nums[left] == target) {return left;}return -1;}// 二分法查找右边界 [left, right]int find_r(vector<int>& nums, int target) {int n = nums.size();int left = 0, right = n - 1;while (left <= right) {// [left, mid - 1] [mid] [mid + 1, right]int mid = left + (right - left) / 2;if (nums[mid] > target) {right = mid - 1;} else {left = mid + 1;}}// right = 4, left = 4 + 1 = 5if (0 <= right && right < n && nums[right] == target) {return right;}return -1;}
};
🥂 81. 搜索旋转排序数组Ⅱ [旋转数组] [有重] [目标值] (二分法)
class Solution {
public:bool search(vector<int>& nums, int target) {int n = nums.size();int left = 0, right = n - 1;// 二分法while (left <= right) {// 判断是否存在int mid = left + (right - left) / 2;if (nums[mid] == target) return true;// 去除重复元素if (nums[mid] == nums[left]) {left++;continue;}if (nums[mid] == nums[right]) {right--;continue;}// 防止卡住, 区分不出左右if (nums[mid] < nums[0]) { // 右// 再判断 target 在右边的左边还是右边 [left, mid-1][mid][mid+1, right]if (nums[mid] < target && target <= nums[n - 1]) {left = mid + 1; // 右右} else {right = mid - 1; // 右左}} else { // 左// 再判断 target 在左边的左边还是右边 [left, mid-1][mid][mid+1, right]if (nums[0] <= target && target < nums[mid]) {right = mid - 1; // 左左} else {left = mid + 1; // 左右}}}return false;}
};
🥂 153. 寻找旋转排序数组中的最小值 [旋转数组] [最小值] (二分法)
class Solution {
public:int findMin(vector<int>& nums) {int left = 0, right = nums.size() - 1;// 二分法 [0, n-1]while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < nums[right]) {right = mid;} else if (nums[mid] > nums[right]) {left = mid + 1;} else {right--;}}return nums[left];}
};
🍺 双指针
🍻 元素合并
🥂 21. 合并两个有序链表 [有序链表] [合并] (双指针) (归并)
class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {// 虚拟头节点, 当前节点指向虚拟头节点ListNode* dummy = new ListNode(-1), * cur = dummy;// 双指针ListNode* p1 = list1, * p2 = list2;while (p1 != nullptr && p2 != nullptr) {if (p1->val < p2->val) {cur->next = p1;p1 = p1->next;} else {cur->next = p2;p2 = p2->next;}cur = cur->next;}// 剩下的直接拼上if (p1 != nullptr) cur->next = p1;if (p2 != nullptr) cur->next = p2;return dummy->next;}
};
🍻 元素交换
🥂 LCR 139. 训练计划 I [数组] [元素交换] (双指针)
class Solution {
public:vector<int> trainingPlan(vector<int>& actions) {int n = actions.size();if (n <= 1) return actions;// 定义双指针,一个指向头,一个指向尾int left = 0, right = n - 1; while (left < right) {// 依次移动,找到数时暂停while (left < right && actions[left] % 2 == 1) {left++;}while (left < right && actions[right] % 2 == 0) {right--;}std::swap(actions[left], actions[right]);}return actions;}
};
🍻 元素相交
🥂 142. 环形链表II [链表] > [环] > (双指针)
// [链表] > [环] > (双指针)
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode* dummy = new ListNode(-1);dummy->next = head;ListNode* fast = dummy, * slow = dummy;// 满指针走一步, 快指针走两步, 判断有无环while (fast->next && fast->next->next) {slow = slow->next;fast = fast->next->next;// 如果相遇, 则让满指针从头开始走, 两者同步移动if (fast == slow) {fast = dummy;while (fast != slow) {slow = slow->next;fast = fast->next;}return fast;}}return nullptr; }
};
🥂 160. 相交链表 [链表] > [相交] > (双指针)
// [链表] > [相交] > (双指针)
class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {// 双指针ListNode *p1 = headA, *p2 = headB;// A 走到 nullptr 后接着走 B, B 走到 nullptr 后接着走 A// 当 p1 == p2 的地方就是相交的地方while (p1 != p2) {if (p1 == nullptr) p1 = headB;else p1 = p1->next;if (p2 == nullptr) p2 = headA;else p2 = p2->next;}return p1;}
};
🍻 面积
🥂 11. 盛最多水的容器 [数组] [面积] (双指针)
class Solution {
public:int maxArea(vector<int>& height) {// 双指针int left = 0, right = height.size() - 1;// 最大面积, 当前面积int res = 0, cur = 0;// 缩小区域while (left < right) {cur = min(height[left], height[right]) * (right - left);res = max(res, cur);// 哪一边比较短, 移动哪一边if (height[left] < height[right]) {left++;} else {right--;}}return res;}
};
🥂 42. 接雨水 [数组] [面积] (双指针)
class Solution {
public:int trap(vector<int>& height) {// 左边边界, 右边边界, 最边上存不了水int left = 0, right = height.size() - 1;// 左边最大值, 右边最大值int left_max = height[left], right_max = height[right];// 当前装水量, 总装水量int cur = 0, res = 0;while (left <= right) {left_max = max(left_max, height[left]);right_max = max(right_max, height[right]);if (left_max < right_max) {// 左指针的leftMax比右指针的rightMax矮// 说明:左指针的右边至少有一个板子 > 左指针左边所有板子// 那么可以计算左指针当前列的水量:左边最大高度-当前列高度res += left_max - height[left];left++;} else {res += right_max - height[right];right--;}}return res;}
};
🥂 其他
🥂 31. 下一个排列 [数组] [排列] (双指针) (推导)
class Solution {
private:int flag = 0; // 设置一个标志位, 代表找到当前排列了
public:void nextPermutation(vector<int>& nums) {int n = nums.size();// 从后往前找, 找到第一个 nums[i] < nums[j] 的地方int i = n - 2, j = n - 1;while (i >= 0 && nums[i] >= nums[i + 1]) {i--;}// 此时不是最后一个排列if (i >= 0) {// 找到一个比 nums[i] 大的第一个元素while (j > i && nums[j] <= nums[i]) {j--;}// 交换两者swap(nums[i], nums[j]);// 再将剩余部分逆转, 把降序变为升序reverse(nums.begin() + i + 1, nums.end());} else {// 如果是最后一个排列reverse(nums.begin(), nums.end());}return;}
};
🍺 三指针
🍻 链表反转
🥂 25. K 个一组翻转链表 [链表] [分组反转] (三指针)
class Solution {
public:ListNode* reverseKGroup(ListNode* head, int k) {// 虚拟头节点ListNode* dummy = new ListNode(-1); dummy->next = head;// 前置节点和后置节点ListNode* pre = dummy, * end = dummy;// 每次翻转 K 个节点while (end->next != nullptr) {for (int i = 0; i < k && end != nullptr; ++i) {end = end->next;}if (end == nullptr) break;// [pre] > [start] > [2] > [end] | [next] [5]ListNode* start = pre->next, * next = end->next;end->next = nullptr;// [pre] > [end] > [2] > [start] | [next] [5]pre->next = reverse(start);// [pre] > [end] > [2] > [start] > [next] [5]start->next = next;pre = start;end = start;}return dummy->next;}// 翻转链表ListNode* reverse(ListNode* head) {// [pre] | [cur] > [next]ListNode* pre = nullptr;ListNode* cur = head;while (cur != nullptr) {ListNode* next = cur->next;// [pre] < [cur] | [next]cur->next = pre;// [N] < [pre] | [cur]pre = cur;cur = next;}// 此时 cur 为空, pre 为最后一个非空节点return pre;}
};
🥂 92. 反转链表II [链表] [反转] (三指针)
class Solution {
public:ListNode* reverseBetween(ListNode* head, int left, int right) {ListNode* dummy = new ListNode(-1);dummy->next = head;// 四个指针分别指向 pre start end next// [1] > [pre] > [start] > [4] > [5] > [end] > [next]ListNode* pre = dummy, * end = dummy;for (int i = 0; i < left - 1; ++i) pre = pre->next;cout << pre->val;for (int j = 0; j < right; ++j) end = end->next;ListNode* start = pre->next, * next = end->next;// [1] > [pre] > [start] > [4] > [5] > [end] | [next]end->next = nullptr;// [1] > [pre] > [end] > [5] > [4] > [start] | [next]pre->next = reverse(start);// [1] > [pre] > [end] > [5] > [4] > [start] > [next]start->next = next;return dummy->next;}// 翻转链表ListNode* reverse(ListNode* head) {// [pre] | [cur] > [next]ListNode* pre = nullptr;ListNode* cur = head;while (cur != nullptr) {ListNode* next = cur->next;// [pre] < [cur] | [next]cur->next = pre;// [N] < [pre] | [cur]pre = cur;cur = next;}// 此时 cur 为空, pre 为最后一个非空节点return pre;}
};
🥂 206. 反转链表 [链表] [反转] (三指针)
class Solution {
public:ListNode* reverseList(ListNode* head) {return reverse(head);}// 翻转链表ListNode* reverse(ListNode* head) {// [pre] | [cur] > [next]ListNode* pre = nullptr;ListNode* cur = head;while (cur != nullptr) {ListNode* next = cur->next;// [pre] < [cur] | [next]cur->next = pre;// [N] < [pre] | [cur]pre = cur;cur = next;}// 此时 cur 为空, pre 为最后一个非空节点return pre;}
};
🍻 快速排序
🥂 215. 数组中的第K个最大元素 [数组] [第K大元素] (三指针) (快速排序)
class Solution {
private:int target; // 目标索引, 第 n-k 小int res; // 目标值
public:int findKthLargest(vector<int>& nums, int k) {// 快速排序, 每次可以确定好一个元素的位置, 当索引为 k 时, 代表找到int n = nums.size();// 第 k 大就是第 n - k 小target = n - k;// 开始快排quickSort(nums, 0, n - 1);return res;}// 快排 [left, right]void quickSort(vector<int>& nums, int left, int right) {if (left > right) return;// 只剩一个元素if (left == right && left == target) {res = nums[target];return;}// 先获取一个哨兵, 将数组分为小于它的部分和大于它的部分vector<int> edge = part(nums, left, right);// 如果 target 在左右边界之间, 则找到if (edge[0] <= target && target <= edge[1]) {res = nums[target];return;}// 继续递归quickSort(nums, left, edge[0] - 1);quickSort(nums, edge[1] + 1, right);}// 分隔, 三指针, 这里返回相同元素的左右边界是为了去重vector<int> part(vector<int>& nums, int left, int right) {int pivot_idx = rand() % (right - left + 1) + left;int pivot = nums[pivot_idx];// [pivot] [1] [2] [3] [4]// L/LP CP RP swap(nums[pivot_idx], nums[left]);// 设置三个指针, 分别指向小于 pivot 的元素, 当前元素, 大于 pivot 的元素int curp = left + 1, leftp = left, rightp = right + 1;// 还没走到尽头, rightp 始终是指向大于 pivot 元素的while (curp < rightp) {if (nums[curp] < pivot) { // 小于哨兵leftp++;swap(nums[curp], nums[leftp]);curp++;} else if (nums[curp] > pivot) { // 大于哨兵rightp--;swap(nums[curp], nums[rightp]);} else { // 相等, 什么也不做curp++;}}// 最后 leftp 指向的内容肯定是最后一个小于 pivot 的, 它与 pivot 交换swap(nums[left], nums[leftp]);// 返回等于 pivot 的左边界和右边界 [小于] [pivot] [大于]return {leftp, rightp - 1};}
};
🥂 912. 排序数组 [数组] [排序] (三指针) (快速排序)
class Solution {
public:vector<int> sortArray(vector<int>& nums) {int n = nums.size();quickSort(nums, 0, n - 1);return nums;}// 快排 [left, right]void quickSort(vector<int>& nums, int left, int right) {// 只剩一个元素, 就不用排了if (left > right) return;// 先获取一个哨兵, 将数组分为小于它的部分和大于它的部分vector<int> edge = part(nums, left, right);// 继续递归quickSort(nums, left, edge[0] - 1);quickSort(nums, edge[1] + 1, right);}// 分隔, 三指针, 这里返回相同元素的左右边界是为了去重vector<int> part(vector<int>& nums, int left, int right) {int pivot_idx = rand() % (right - left + 1) + left;int pivot = nums[pivot_idx];// [pivot] [1] [2] [3] [4]// L/LP CP RP swap(nums[pivot_idx], nums[left]);// 设置三个指针, 分别指向小于 pivot 的元素, 当前元素, 大于 pivot 的元素int curp = left + 1, leftp = left, rightp = right + 1;// 还没走到尽头, rightp 始终是指向大于 pivot 元素的while (curp < rightp) {if (nums[curp] < pivot) { // 小于哨兵leftp++;swap(nums[curp], nums[leftp]);curp++;} else if (nums[curp] > pivot) { // 大于哨兵rightp--;swap(nums[curp], nums[rightp]);} else { // 相等, 什么也不做curp++;}}// 最后 leftp 指向的内容肯定是最后一个小于 pivot 的, 它与 pivot 交换swap(nums[left], nums[leftp]);// 返回等于 pivot 的左边界和右边界 [小于] [pivot] [大于]return {leftp, rightp - 1};}
};
🍺 滑动窗口
🍻 子串
🥂 3. 无重复字符的最长子串 [字符串] [子串] (滑动窗口)
class Solution {
private:unordered_map<char, int> umap; // 滑动窗口int res = 0; // 存放结果
public:int lengthOfLongestSubstring(string s) {int n = s.size();int left = 0, right = 0; // 窗口边界while (right < n) {char cur_r = s[right++]; // 取当前字符串umap[cur_r]++; // 更新窗口内容// 判断是否该缩小窗口while (umap[cur_r] > 1) {char cur_l = s[left++];umap[cur_l]--;}// 此时已经没有重复元素出现 [left, right)res = max(res, right - left);}return res;}
};
🍻 区间和
🥂 1423. 可获得的最大点数 [数组] > [区间外最大值] > [区间内最小值] > (定长滑动窗口)
// [数组] > [区间外最大值] > [区间内最小值] > (定长滑动窗口)
class Solution {
public:int maxScore(vector<int>& cardPoints, int k) {int n = cardPoints.size();int windowSize = n - k;// [0, n-k] 的区间和int sum = accumulate(cardPoints.begin(), cardPoints.begin() + windowSize, 0);int min_val = sum; // 窗口的最小值// 移动for (int i = 0; i < n - windowSize; ++i) {int left = i, right = i + windowSize;sum += cardPoints[right] - cardPoints[left];min_val = min(min_val, sum);}return accumulate(cardPoints.begin(), cardPoints.end(), 0) - min_val;}
};
相关文章:
算法 - 二分法 / 双指针 / 三指针 / 滑动窗口
文章目录 🍺 二分法🍻 旋转数组🥂 33. 搜索旋转排序数组 [旋转数组] [目标值] (二分法) 🍻 元素边界🥂 34. 在排序数组中查找元素的第一个和最后一个位置 [有序数组] > [元素边界] > (二分法)🥂 81. …...
ChatGPT3.5、GPT4.0、DALL·E 3和Midjourney对话与绘画智能体验
MidTool(https://www.aimidtool.com/)是一个集成了多种先进人工智能技术的助手,它融合了ChatGPT3.5、GPT4.0、DALLE 3和Midjourney等不同的智能服务,提供了一个多功能的体验。下面是这些技术的简要介绍: ChatGPT3.5&am…...
MySQL中锁的概述
按照锁的粒度来分可分为:全局锁(锁住当前数据库的所有数据表),表级锁(锁住对应的数据表),行级锁(每次锁住对应的行数据) 加全局锁:flush tables with read lo…...
5396. 棋盘
5396. 棋盘 - AcWing题库 二维差分数组 #include <iostream> #include <vector> using namespace std;int main() {int n, m;cin >> n >> m;vector<vector<int>> v(n 2, vector<int>(n 2));while (m--) {int x1, x2, y1, y2;cin…...
阿里云地域和可用区分布表,2024更新
2024年阿里云服务器地域分布表,地域指数据中心所在的地理区域,通常按照数据中心所在的城市划分,例如华北2(北京)地域表示数据中心所在的城市是北京。阿里云地域分为四部分即中国、亚太其他国家、欧洲与美洲和中东&…...
Pandas实战100例 | 案例 49: 数值运算
案例 49: 数值运算 知识点讲解 Pandas 提供了进行基本数学运算的简便方法,允许你在 DataFrame 的列之间执行加法、减法、乘法和除法等操作。 数值运算: 直接对 DataFrame 的列应用算术运算符(+, -, *, /)可以执行相应的数值运算。示例代码 # 准备数据和示例代码的运行结果…...
OSI七层协议和五层协议
【 1 】互联网协议交互的基础 硬件设备 光缆 【 2 】OSI七层协议 物理层(Physical Layer):负责传输比特流(0和1)以及物理连接的建立和维护。数据链路层(Data Link Layer):提供可…...
深度学习记录--归—化输入特征
归化 归化输入(normalizing inputs),对特征值进行一定的处理,可以加速神经网络训练速度 步骤 零均值化 通过x值更新让均值稳定在零附近,即为零均值化 归化方差 适当减小变量方差 解释 归化可以让原本狭长的数据图像变得规整,梯度下降的…...
Go Build编译打包文件
Go编译打包文件 1、简单打包 程序 main1.go: package mainimport "fmt"func main() {fmt.Println("Hello World!") }打包: # 在linux服务上执行下面的3个命令 # linux平台,生成main1可执行程序 CGO_ENABLED0 GOOSlinux GOARCHam…...
Java网络编程:概述--快速入门
I. 介绍 1.1 什么是网络编程 - 网络编程是指通过计算机网络实现程序之间的通信。在Java中,网络编程通常涉及到数据的传输、通信协议的使用以及与网络相关的各种操作。 1.2. 为什么学习Java网络编程 - Java网络编程是Java开发者重要的技能之一,因为它允许…...
linux配置DNS主从服务器
实验设备 主服务器:OpenElur Linux IP地址为192.168.188.129 从服务器:RedHat Linux IP地址为192.168.188.128 实验步骤 1.进行主服务器的基础配置 #安装DNS对应工具 [rootOpenElurRJW ~]# yum install bind -y#编辑DNS系统配置信息 [rootOpenElurRJW ~]# cat /etc/named.…...
Day34 贪心算法 part03 1005. K 次取反后最大化的数组和 134. 加油站 135. 分发糖果
贪心算法 part03 1005. K 次取反后最大化的数组和 134. 加油站 135. 分发糖果 1005. K 次取反后最大化的数组和 思路 第一步,从前向后遍历,遇到负数将其变为正数,同时K–第二步:如果K还大于0,那么反复转变数值最小的…...
最全对象存储(云盘)挂载本地主机或服务器
1.对象存储介绍 1.1 分类 分布式存储的应用场景相对于其存储接口,现在流行分为三种: 块存储: 这种接口通常以QEMU Driver或者Kernel Module的方式存在,这种接口需要实现Linux的Block Device的接口或者QEMU提供的Block Driver接口,块存储一般…...
24校招,江淮汽车软件测试工程师技术面+HR面
前言 记录一下楼主的面试经历,希望对后来者有用 时间:15min 平台:腾讯会议 过程 技术面试 自我介绍 为啥不考研 实习收获 你有做过软件开发的工作吗? 除了Java和Python,还会其他的语言吗? 学过C吗…...
从零开始学习Zeppelin:大数据可视化分析的交互式开发系统!
介绍:Apache Zeppelin是一个基于Web的交互式开发系统,主要用于进行大数据可视化分析。其核心概念是notebook,所有的操作都可以在notebook中完成。Zeppelin提供了一套非常全面的数据分析解决方案,支持数据采集、数据发现、数据分析…...
VCG 曲面重建之滚球算法
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 滚球算法(BPA)是一种与alpha形状相关的曲面重建方法。直观地想象一个具有给定半径的3D球,我们把它扔在点云上。如果它击中任何3个点(并且它没有穿过这3个点),它就创造了一个三角形。然后,算法从现有三角形的边缘…...
为什么使用双token实现无感刷新用户认证?
单token机制 认证机制:对与单token的认证机制在我们项目中仅使用一个Access Token的访问令牌进行用户身份认证和授权的方案处理。 不足之处: 安全性较低(因为只有一个token在客户端和服务器端之间进行传递,一目Acess Token被截获或者被泄露…...
论文阅读 Self-Supervised Burst Super-Resolution
这是一篇 ICCV 2023 的文章,主要介绍的是用自监督的方式进行多帧超分的学习 Abstract 这篇文章介绍了一种基于自监督的学习方式来进行多帧超分的任务,这种方法只需要原始的带噪的低分辨率的图。它不需要利用模拟退化的方法来构造数据,而且模…...
Spring+SpringMVC+Mybatis进行项目的整合
Spring SpringMVCM Mybatis 整合 一、 通过idea创建maven工程 二、 引入依赖项以及导入mybatis逆向工程的插件 将如下的文件替换所在工程的pom文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4…...
vue3 实现简单计数器示例——一个html文件展示vue3的效果
目的:作为一个新手开发,我想使用 Vue 3 将代码封装在 HTML 文件中时,进行界面打开展示。 一、vue计数示例 学了一个简单计数器界面展示,代码如下: <!DOCTYPE html> <html lang"en"><head&…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
