D357周赛复盘:模拟双端队列反转⭐⭐+贪心
文章目录
- 2810.故障键盘
- 1.直接用reverse解决
- 2.双端队列
- 2811.判断能否拆分数组(比较巧妙的贪心)
- 思路
- 完整版
- 2812.找出最安全路径
- 2810.故障键盘
- 1.直接用reverse解决
- 2.双端队列
- 2811.判断能否拆分数组(比较巧妙的贪心)
- 思路
- 完整版
- 2812.找出最安全路径
2810.故障键盘
你的笔记本键盘存在故障,每当你在上面输入字符 'i' 时,它会反转你所写的字符串。而输入其他字符则可以正常工作。
给你一个下标从 0 开始的字符串 s ,请你用故障键盘依次输入每个字符。
返回最终笔记本屏幕上输出的字符串。
示例 1:
输入:s = "string"
输出:"rtsng"
解释:
输入第 1 个字符后,屏幕上的文本是:"s" 。
输入第 2 个字符后,屏幕上的文本是:"st" 。
输入第 3 个字符后,屏幕上的文本是:"str" 。
因为第 4 个字符是 'i' ,屏幕上的文本被反转,变成 "rts" 。
输入第 5 个字符后,屏幕上的文本是:"rtsn" 。
输入第 6 个字符后,屏幕上的文本是: "rtsng" 。
因此,返回 "rtsng" 。
示例 2:
输入:s = "poiinter"
输出:"ponter"
解释:
输入第 1 个字符后,屏幕上的文本是:"p" 。
输入第 2 个字符后,屏幕上的文本是:"po" 。
因为第 3 个字符是 'i' ,屏幕上的文本被反转,变成 "op" 。
因为第 4 个字符是 'i' ,屏幕上的文本被反转,变成 "po" 。
输入第 5 个字符后,屏幕上的文本是:"pon" 。
输入第 6 个字符后,屏幕上的文本是:"pont" 。
输入第 7 个字符后,屏幕上的文本是:"ponte" 。
输入第 8 个字符后,屏幕上的文本是:"ponter" 。
因此,返回 "ponter" 。
提示:
1 <= s.length <= 100s由小写英文字母组成s[0] != 'i'
1.直接用reverse解决
反转字符串可以直接用reverse来解决,如下:
class Solution {
public:string finalString(string s) {string result=" ";for(char c:s){if(c=='i'){reverse(result.begin(),result.end());}else{result.push_back(c);}}return result;}
};
2.双端队列
遇到字符i时,可以通过栈来实现字符串反转的效果。这是因为栈是后进先出(LIFO)的数据结构,它可以帮助我们将之前输入的字符逆序输出。
但是,用栈的话,无法处理字符串本身没有i这种情况,因此应该使用双端队列。
双端队列思路:
-
初始化一个双端队列
deque<char> q:双端队列允许我们在队列的头部和尾部都进行添加和删除操作。 -
使用一个布尔变量
right来确定插入的方向:当right为true时,我们在队列的尾部插入字符;当right为false时,我们在队列的头部插入字符。 -
遍历输入的字符串
s中的每个字符:- 如果字符是 ‘i’:则将
right的值取反,即改变插入方向。因此,如果之前是在尾部插入,现在就在头部插入,反之亦然。 - 如果字符不是 ‘i’ 且
right为true:则在双端队列的尾部插入该字符。 - 如果字符不是 ‘i’ 且
right为false:则在双端队列的头部插入该字符。
- 如果字符是 ‘i’:则将
-
将双端队列
q转化为字符串result:这里,利用了字符串的迭代器构造函数,将q的所有字符转化为一个字符串。 -
检查最后的插入方向:如果最后的插入方向是在头部(即
right为false),说明队列中的字符序列是相反的,因此我们需要将result反转。 -
返回结果字符串
result。关键思想是,利用双端队列模拟字符串的插入过程,每当遇到字符 ‘i’ 时,改变插入的方向。这种方法的效率很高,因为在双端队列的头部和尾部插入字符的时间复杂度都是 O(1)。
class Solution {
public:string finalString(string s) {//双端队列deque<char>q;bool right = true;//设定一个量用来修改添加方向for(char c:s){if(c=='i'){right=!right;//方向返过来,而且i本身是不管的,所以可以直接else if}else if(right){q.push_back(c);}else {q.push_front(c);}}string result(q.begin(),q.end());//可以直接把双端队列放在字符串里if(!right){//有偶数个i的时候,实际上最后的result是不变的,直接看right是不是true就可以reverse(result.begin(),result.end());}return result;}
};
2811.判断能否拆分数组(比较巧妙的贪心)
给你一个长度为 n 的数组 nums 和一个整数 m 。请你判断能否执行一系列操作,将数组拆分成 n 个 非空 数组。
在每一步操作中,你可以选择一个 长度至少为 2 的现有数组(之前步骤的结果) 并将其拆分成 2 个子数组,而得到的 每个 子数组,至少 需要满足以下条件之一:
- 子数组的长度为 1 ,或者
- 子数组元素之和 大于或等于
m。
如果你可以将给定数组拆分成 n 个满足要求的数组,返回 true ;否则,返回 false 。
**注意:**子数组是数组中的一个连续非空元素序列。
示例 1:
输入:nums = [2, 2, 1], m = 4
输出:true
解释:
第 1 步,将数组 nums 拆分成 [2, 2] 和 [1] 。
第 2 步,将数组 [2, 2] 拆分成 [2] 和 [2] 。
因此,答案为 true 。
示例 2:
输入:nums = [2, 1, 3], m = 5
输出:false
解释:
存在两种不同的拆分方法:
第 1 种,将数组 nums 拆分成 [2, 1] 和 [3] 。
第 2 种,将数组 nums 拆分成 [2] 和 [1, 3] 。
然而,这两种方法都不满足题意。因此,答案为 false 。
示例 3:
输入:nums = [2, 3, 3, 2, 3], m = 6
输出:true
解释:
第 1 步,将数组 nums 拆分成 [2, 3, 3, 2] 和 [3] 。
第 2 步,将数组 [2, 3, 3, 2] 拆分成 [2, 3, 3] 和 [2] 。
第 3 步,将数组 [2, 3, 3] 拆分成 [2] 和 [3, 3] 。
第 4 步,将数组 [3, 3] 拆分成 [3] 和 [3] 。
因此,答案为 true 。
提示:
1 <= n == nums.length <= 1001 <= nums[i] <= 1001 <= m <= 200
思路
这道题用的是贪心的思想,只要有两个连续的数字加起来>=m,就可以把除了这俩之外的都拆出去。
也就是说,只要有一组连续数字相加>=m,那么一定可以满足条件2。条件1是一定可以满足的,需要满足的是有两个连续的数字相加>=m。这样最后才能拆出来两个1。
完整版
class Solution {
public:bool canSplitArray(vector<int>& nums, int m) {if(nums.size()==1||nums.size()==2){return true;}for(int i=0;i<nums.size()-1;i++){if(nums[i]+nums[i+1]>=m){return true;}}return false;}
};
这是一种很巧妙的贪心,主要是这道题两个条件满足一个即可,而且数组全是正整数,有两个相加>=m,最后结果一定>=m。
2812.找出最安全路径
给你一个下标从 0 开始、大小为 n x n 的二维矩阵 grid ,其中 (r, c) 表示:
- 如果
grid[r][c] = 1,则表示一个存在小偷的单元格 - 如果
grid[r][c] = 0,则表示一个空单元格
你最开始位于单元格 (0, 0) 。在一步移动中,你可以移动到矩阵中的任一相邻单元格,包括存在小偷的单元格。
矩阵中路径的 安全系数 定义为:从路径中任一单元格到矩阵中任一小偷所在单元格的 最小 曼哈顿距离。
返回所有通向单元格 (n - 1, n - 1) 的路径中的 最大安全系数 。
单元格 (r, c) 的某个 相邻 单元格,是指在矩阵中存在的 (r, c + 1)、(r, c - 1)、(r + 1, c) 和 (r - 1, c) 之一。
两个单元格 (a, b) 和 (x, y) 之间的 曼哈顿距离 等于 | a - x | + | b - y | ,其中 |val| 表示 val 的绝对值。
示例 1:
2810.故障键盘
你的笔记本键盘存在故障,每当你在上面输入字符 'i' 时,它会反转你所写的字符串。而输入其他字符则可以正常工作。
给你一个下标从 0 开始的字符串 s ,请你用故障键盘依次输入每个字符。
返回最终笔记本屏幕上输出的字符串。
示例 1:
输入:s = "string"
输出:"rtsng"
解释:
输入第 1 个字符后,屏幕上的文本是:"s" 。
输入第 2 个字符后,屏幕上的文本是:"st" 。
输入第 3 个字符后,屏幕上的文本是:"str" 。
因为第 4 个字符是 'i' ,屏幕上的文本被反转,变成 "rts" 。
输入第 5 个字符后,屏幕上的文本是:"rtsn" 。
输入第 6 个字符后,屏幕上的文本是: "rtsng" 。
因此,返回 "rtsng" 。
示例 2:
输入:s = "poiinter"
输出:"ponter"
解释:
输入第 1 个字符后,屏幕上的文本是:"p" 。
输入第 2 个字符后,屏幕上的文本是:"po" 。
因为第 3 个字符是 'i' ,屏幕上的文本被反转,变成 "op" 。
因为第 4 个字符是 'i' ,屏幕上的文本被反转,变成 "po" 。
输入第 5 个字符后,屏幕上的文本是:"pon" 。
输入第 6 个字符后,屏幕上的文本是:"pont" 。
输入第 7 个字符后,屏幕上的文本是:"ponte" 。
输入第 8 个字符后,屏幕上的文本是:"ponter" 。
因此,返回 "ponter" 。
提示:
1 <= s.length <= 100s由小写英文字母组成s[0] != 'i'
1.直接用reverse解决
反转字符串可以直接用reverse来解决,如下:
class Solution {
public:string finalString(string s) {string result=" ";for(char c:s){if(c=='i'){reverse(result.begin(),result.end());}else{result.push_back(c);}}return result;}
};
2.双端队列
遇到字符i时,可以通过栈来实现字符串反转的效果。这是因为栈是后进先出(LIFO)的数据结构,它可以帮助我们将之前输入的字符逆序输出。
但是,用栈的话,无法处理字符串本身没有i这种情况,因此应该使用双端队列。
双端队列思路:
-
初始化一个双端队列
deque<char> q:双端队列允许我们在队列的头部和尾部都进行添加和删除操作。 -
使用一个布尔变量
right来确定插入的方向:当right为true时,我们在队列的尾部插入字符;当right为false时,我们在队列的头部插入字符。 -
遍历输入的字符串
s中的每个字符:- 如果字符是 ‘i’:则将
right的值取反,即改变插入方向。因此,如果之前是在尾部插入,现在就在头部插入,反之亦然。 - 如果字符不是 ‘i’ 且
right为true:则在双端队列的尾部插入该字符。 - 如果字符不是 ‘i’ 且
right为false:则在双端队列的头部插入该字符。
- 如果字符是 ‘i’:则将
-
将双端队列
q转化为字符串result:这里,利用了字符串的迭代器构造函数,将q的所有字符转化为一个字符串。 -
检查最后的插入方向:如果最后的插入方向是在头部(即
right为false),说明队列中的字符序列是相反的,因此我们需要将result反转。 -
返回结果字符串
result。关键思想是,利用双端队列模拟字符串的插入过程,每当遇到字符 ‘i’ 时,改变插入的方向。这种方法的效率很高,因为在双端队列的头部和尾部插入字符的时间复杂度都是 O(1)。
class Solution {
public:string finalString(string s) {//双端队列deque<char>q;bool right = true;//设定一个量用来修改添加方向for(char c:s){if(c=='i'){right=!right;//方向返过来,而且i本身是不管的,所以可以直接else if}else if(right){q.push_back(c);}else {q.push_front(c);}}string result(q.begin(),q.end());//可以直接把双端队列放在字符串里if(!right){//有偶数个i的时候,实际上最后的result是不变的,直接看right是不是true就可以reverse(result.begin(),result.end());}return result;}
};
2811.判断能否拆分数组(比较巧妙的贪心)
给你一个长度为 n 的数组 nums 和一个整数 m 。请你判断能否执行一系列操作,将数组拆分成 n 个 非空 数组。
在每一步操作中,你可以选择一个 长度至少为 2 的现有数组(之前步骤的结果) 并将其拆分成 2 个子数组,而得到的 每个 子数组,至少 需要满足以下条件之一:
- 子数组的长度为 1 ,或者
- 子数组元素之和 大于或等于
m。
如果你可以将给定数组拆分成 n 个满足要求的数组,返回 true ;否则,返回 false 。
**注意:**子数组是数组中的一个连续非空元素序列。
示例 1:
输入:nums = [2, 2, 1], m = 4
输出:true
解释:
第 1 步,将数组 nums 拆分成 [2, 2] 和 [1] 。
第 2 步,将数组 [2, 2] 拆分成 [2] 和 [2] 。
因此,答案为 true 。
示例 2:
输入:nums = [2, 1, 3], m = 5
输出:false
解释:
存在两种不同的拆分方法:
第 1 种,将数组 nums 拆分成 [2, 1] 和 [3] 。
第 2 种,将数组 nums 拆分成 [2] 和 [1, 3] 。
然而,这两种方法都不满足题意。因此,答案为 false 。
示例 3:
输入:nums = [2, 3, 3, 2, 3], m = 6
输出:true
解释:
第 1 步,将数组 nums 拆分成 [2, 3, 3, 2] 和 [3] 。
第 2 步,将数组 [2, 3, 3, 2] 拆分成 [2, 3, 3] 和 [2] 。
第 3 步,将数组 [2, 3, 3] 拆分成 [2] 和 [3, 3] 。
第 4 步,将数组 [3, 3] 拆分成 [3] 和 [3] 。
因此,答案为 true 。
提示:
1 <= n == nums.length <= 1001 <= nums[i] <= 1001 <= m <= 200
思路
这道题用的是贪心的思想,只要有两个连续的数字加起来>=m,就可以把除了这俩之外的都拆出去。
也就是说,只要有一组连续数字相加>=m,那么一定可以满足条件2。条件1是一定可以满足的,需要满足的是有两个连续的数字相加>=m。这样最后才能拆出来两个1。
完整版
class Solution {
public:bool canSplitArray(vector<int>& nums, int m) {if(nums.size()==1||nums.size()==2){return true;}for(int i=0;i<nums.size()-1;i++){if(nums[i]+nums[i+1]>=m){return true;}}return false;}
};
这是一种很巧妙的贪心,主要是这道题两个条件满足一个即可,而且数组全是正整数,有两个相加>=m,最后结果一定>=m。
2812.找出最安全路径
给你一个下标从 0 开始、大小为 n x n 的二维矩阵 grid ,其中 (r, c) 表示:
- 如果
grid[r][c] = 1,则表示一个存在小偷的单元格 - 如果
grid[r][c] = 0,则表示一个空单元格
你最开始位于单元格 (0, 0) 。在一步移动中,你可以移动到矩阵中的任一相邻单元格,包括存在小偷的单元格。
矩阵中路径的 安全系数 定义为:从路径中任一单元格到矩阵中任一小偷所在单元格的 最小 曼哈顿距离。
返回所有通向单元格 (n - 1, n - 1) 的路径中的 最大安全系数 。
单元格 (r, c) 的某个 相邻 单元格,是指在矩阵中存在的 (r, c + 1)、(r, c - 1)、(r + 1, c) 和 (r - 1, c) 之一。
两个单元格 (a, b) 和 (x, y) 之间的 曼哈顿距离 等于 | a - x | + | b - y | ,其中 |val| 表示 val 的绝对值。
示例 1:

输入:grid = [[1,0,0],[0,0,0],[0,0,1]]
输出:0
解释:从 (0, 0) 到 (n - 1, n - 1) 的每条路径都经过存在小偷的单元格 (0, 0) 和 (n - 1, n - 1) 。
示例 2:

输入:grid = [[0,0,1],[0,0,0],[0,0,0]]
输出:2
解释:
上图所示路径的安全系数为 2:
- 该路径上距离小偷所在单元格(0,2)最近的单元格是(0,0)。它们之间的曼哈顿距离为 | 0 - 0 | + | 0 - 2 | = 2 。
可以证明,不存在安全系数更高的其他路径。
示例 3:

输入:grid = [[0,0,0,1],[0,0,0,0],[0,0,0,0],[1,0,0,0]]
输出:2
解释:
上图所示路径的安全系数为 2:
- 该路径上距离小偷所在单元格(0,3)最近的单元格是(1,2)。它们之间的曼哈顿距离为 | 0 - 1 | + | 3 - 2 | = 2 。
- 该路径上距离小偷所在单元格(3,0)最近的单元格是(3,2)。它们之间的曼哈顿距离为 | 3 - 3 | + | 0 - 2 | = 2 。
可以证明,不存在安全系数更高的其他路径。
提示:
1 <= grid.length == n <= 400grid[i].length == ngrid[i][j]为0或1grid至少存在一个小偷
这道题是bfs,笔试考的比较多。先记录一下做法。
class Solution {
public:int maximumSafenessFactor(vector<vector<int>>& grid) {int n = grid.size();vector<vector<int>> dist(n, vector<int>(n, INT_MAX));vector<vector<int>> safe(n, vector<int>(n, 0));queue<pair<int, int>> q;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {if (grid[i][j] == 1) {dist[i][j] = 0;q.push({i, j});}}}vector<vector<int>> dirs = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};while (!q.empty()) {int r = q.front().first, c = q.front().second;q.pop();for (auto &dir : dirs) {int nr = r + dir[0], nc = c + dir[1];if (nr >= 0 && nr < n && nc >= 0 && nc < n && dist[r][c] + 1 < dist[nr][nc]) {dist[nr][nc] = dist[r][c] + 1;q.push({nr, nc});}}}safe[n-1][n-1] = dist[n-1][n-1];q.push({n-1, n-1});while (!q.empty()) {int r = q.front().first, c = q.front().second;q.pop();for (auto &dir : dirs) {int nr = r + dir[0], nc = c + dir[1];if (nr >= 0 && nr < n && nc >= 0 && nc < n) {int newSafe = min(safe[r][c], dist[nr][nc]);if (newSafe > safe[nr][nc]) {safe[nr][nc] = newSafe;q.push({nr, nc});}}}}return safe[0][0];}
};
相关文章:
D357周赛复盘:模拟双端队列反转⭐⭐+贪心
文章目录 2810.故障键盘1.直接用reverse解决2.双端队列 2811.判断能否拆分数组(比较巧妙的贪心)思路完整版 2812.找出最安全路径2810.故障键盘1.直接用reverse解决2.双端队列 2811.判断能否拆分数组(比较巧妙的贪心)思路完整版 28…...
大数据项目实战(安装Hive)
一,搭建大数据集群环境 1.3 安装Hive 1.3.1 Hive的安装 1.安装MySQL服务 1)检查是否安装MySQL,如安装将其卸载。卸载命令 rpm -qa | grep mysql 2)搜索MySQL文件夹,如存在则删除 find / -name mysql rm -rf /etc/s…...
跨屏无界 | ZlongGames 携手 Google Play Games 打造无缝游戏体验
一款经典游戏,会在时间的沉淀中被每一代玩家所怀念,经久不衰。对于紫龙游戏来讲,他们就是这样一群怀揣着创作出经典游戏的初心而聚集在一起的团队,致力于研发出被广大玩家喜爱的作品。 从 2015 年团队成立,到 2019 年走…...
mysql数据文件
提示:mysql相关系列的教程和笔记不断持续更新和完善 文章目录 db.opt 文件FRM 文件MYD 文件MYI 文件IBD 文件和 IBDATA 文件 :ibdata1 ibdata n文件 查看数据文件的位置 获取硬盘中数据存储的位置: SHOW VARIABLES LIKE datadir;db.opt 文件 该文件记录…...
Vue2里监听localstorage里值的变化
有的时候,我们需要根据本地缓存在localstorage里值的变化做出相应的操作,这就需要我们监听localstorage: 首先,我们在src下的libs文件夹下新建一个stroage.js用于重写setItem事件,当使用setItem的时候,触发,window.dispatchEvent派发事件 const Stroage = {// 重写set…...
QSqlDatabase(2)实例,QTableView显示数据库表数据
目录 前言 1、实现的功能 2、具体的代码实现 前言 想了解QSqlDatabase基本知识的,以及增删改查的用法,可以浏览上一篇文章: QSqlDatabase(1)基本接口,以及(增删改除)的简单实例_Ivy_belief的博客-CSDN…...
vue3 监听props 的变化
再三说明 仅仅个人学习用,不误导别人 我觉得props 会创建对应的属性,去接受这些值,比如传递一个ref的基本值 age props.age age.value 传递一个ref的引用值 person props.person person.value 传递一个reactive的引用值 person props.person…...
Docker容器
1、什么是docker,为什么要使用docker 有了docker,可以获取各种软件的镜像,将软件的镜像下载到linux中,基于这个镜像就能够去启动这个容器,这个容器就是这个镜像的完整运行环境,比如mysql、redis、nginx,还能秒级启动他…...
spring 请求等问题
1.post请求 /*** desc: (gateway主要接收前端请求 , 然后对请求的数据进行验证 , 验证之后请求反向代理到服务器 。*当请求 method 为 GET 时 , 可以顺利通过gateway 。 当请求 method 为 POST 时 , gateway则会报如下错误 。*jav…...
汽车制造行业,配电柜如何实施监控?
工业领域的生产过程依赖于高效、稳定的电力供应,而配电柜作为电力分配和控制的关键组件,其监控显得尤为重要。 配电柜监控通过实时监测、数据收集和远程控制,为工业企业提供了一种有效管理电能的手段,从而确保生产的连续性、安全性…...
stable diffusion实践操作-VAE
本文专门开一节写图生图相关的内容,在看之前,可以同步关注: stable diffusion实践操作 大部分底模有VAE,但是部分底模没有VAE,需要专门下载VAE才能使用。 最常用的VAE:vae-ft-mse-840000-ema-pruned 用来饱…...
《Flink学习笔记》——第一章 概念及背景
什么是批处理和流处理,然后由传统数据处理架构为背景引出什么是有状态的流处理,为什么需要流处理,而什么又是有状态的流处理。进而再讲解流处理的发展和演变。而Flink作为新一代的流处理器,它有什么优势?它的相关背…...
顺序表链表OJ题(2)->【数据结构】
W...Y的主页 😊 代码仓库分享 💕 前言: 单链表的结构常常不完美,没有双向链表那么”优秀“,所以繁衍出很多OJ练习题。今天我们继续来look look数据结构习题。 下面就是OJ时间!!! …...
css3有哪些新特性?(包含哪些模块)
css3有哪些新特性?包含哪些模块?以下是整理的21个css3新特性: 1.新增选择器 p:nth-child(n){color: rgba(255, 0, 0, 0.75)} 2.新增伪元素 ::before 和 ::after 3.弹性盒模型 display: flex; 4.多列布局 column-count: 5; 5.媒体查询 media (max-width:…...
【Grasshopper基础15】“右键菜单似乎不太对劲”
距离上一篇文章已经过去了挺久的,很长时间没有写GH基础部分的内容了,原因其一是本职工作太忙了,进度也有些落后,白天工作累成马,回家只想躺着;其二则是感觉GH基础系列基本上也介绍得差不多了,电…...
华为Mate60低调发布,你所不知道的高调真相?
华为Mate60 pro 这两天的劲爆新闻想必各位早已知晓,那就是华为Mate60真的来了!!!并且此款手机搭载了最新国产麒麟9000s芯片,该芯片重新定义了手机性能的巅峰。不仅在Geekbench测试中表现出色,还在实际应用…...
C++(18):命名空间
多个库将名字放置在全局命名空间中将引发命名空间污染。 命名空间可以用来防止名字冲突,它分割了全局命名空间,其中每个命名空间是一个作用域。通过在某个命名空间中定义库的名字,库的作者(以及用户)可以避免全局名字…...
K8S最新版本集群部署(v1.28) + 容器引擎Docker部署(上)
温故知新 📚第一章 前言📗背景📗目的📗总体方向 📚第二章 基本环境信息📗机器信息📗软件信息📗部署用户kubernetes 📚第三章 Kubernetes各组件部署📗安装kube…...
生产环境部署与协同开发 Git
目录 一、前言——Git概述 1.1 Git是什么 1.2 为什么要使用Git 什么是版本控制系统 1.3 Git和SVN对比 SVN集中式 Git分布式 1.4 Git工作流程 四个工作区域 工作流程 1.5 Git下载安装 1.6 环境配置 设置用户信息 查看配置信息 二、git基础 2.1 本地初始化仓库 编辑…...
Qt/C++编写视频监控系统80-远程回放视频流
一、前言 远程回放NVR或者服务器上的视频文件,一般有三种方式,第一种是调用厂家的SDK,这个功能最全,但是缺点明显就是每个厂家的设备都有自己的SDK,只兼容自家的设备,如果你的软件需要接入多个厂家的&…...
CVE-2016-2183漏洞自查与修复指南:你的Nginx/Apache还在用有问题的SSL/TLS协议吗?
CVE-2016-2183漏洞深度解析与实战修复:从检测到防护的全链路方案 凌晨三点,运维团队的告警系统突然响起——安全扫描报告显示生产环境存在SSL/TLS协议信息泄露风险。这不是普通的漏洞警报,而是可能直接导致加密通信被破解的CVE-2016-2183。作…...
【Java微服务Istio配置黄金法则】:20年架构师亲授5大避坑指南与生产级配置模板
第一章:Java微服务Istio配置的核心认知与演进脉络Istio 作为云原生服务网格的事实标准,其配置体系并非孤立存在,而是深度耦合于 Java 微服务的生命周期、通信契约与可观测性需求。早期 Spring Cloud Netflix 生态依赖客户端库(如 …...
2026软考高项论文题目预测!十大管理+绩效域双押题(附答题思路)
备考软考高项的同学都知道,论文是决定成败的关键一科。随着2025年绩效域全面上位,论文考核方式已从“单一知识点”升级为“绩效域协同五大过程组联动可量化测量指标”的实战型命题。2026年考什么?如何准备?本文基于近3年命题规律&…...
从404到无损输出:一个Favicon抓取API的三年优化笔记(含CDN、懒加载避坑指南)
从404到毫秒响应:Favicon API架构演进与高并发实践 第一次收到用户反馈"favicon接口返回500错误"时,我们团队正在会议室讨论如何优化爬虫性能。那是个典型的周一早晨——咖啡还没喝完,警报先响了起来。这个看似简单的图标抓取服务&…...
OpenClaw本地模型对比:千问3.5-35B-A3B-FP8与开源替代方案
OpenClaw本地模型对比:千问3.5-35B-A3B-FP8与开源替代方案 1. 为什么需要本地模型对比 当我第一次尝试在OpenClaw中接入本地大模型时,面对众多开源选项感到非常困惑。每个模型都宣称自己性能优越,但实际部署后却发现资源消耗、推理速度与预…...
Open Event Server数据导入导出完全指南:支持JSON、XML、iCal格式的终极教程
Open Event Server数据导入导出完全指南:支持JSON、XML、iCal格式的终极教程 【免费下载链接】open-event-server The Open Event Organizer Server to Manage Events https://test-api.eventyay.com 项目地址: https://gitcode.com/gh_mirrors/op/open-event-ser…...
StemRoller安全与沙盒:保护用户数据的最佳实践
StemRoller安全与沙盒:保护用户数据的最佳实践 【免费下载链接】stemroller Isolate vocals, drums, bass, and other instrumental stems from any song 项目地址: https://gitcode.com/gh_mirrors/st/stemroller StemRoller是一款能够从任何歌曲中分离人声…...
学历作为硬实力:当代中国权力结构中知识资本的制度化逻辑与社会地位再生产机制
学历作为硬实力:当代中国权力结构中知识资本的制度化逻辑与社会地位再生产机制 作者:培风图南以星河揽胜 专栏链接:澄心观道 字数:约 14,200 字 | 阅读时长:约 52 分钟 引言:一个被广泛观察却少有深究的社会…...
OpenClaw对话日志分析:Qwen3-14B挖掘用户真实需求
OpenClaw对话日志分析:Qwen3-14B挖掘用户真实需求 1. 为什么需要分析对话日志? 作为一个长期使用OpenClaw的开发者,我发现自己陷入了一个典型的技术陷阱:花大量时间开发新功能,却很少回头审视用户实际如何使用这些功…...
QT 生成动态链接库
QT 生成动态链接库 前言 一、创建新的动态库项目(Qt Creator) 1 新建项目 二 、 自动生成的文件结构 1 项目会包含一个导出宏定义头文件,例如 Test001_global.h: 2 在需要导出的类或函数前加上 TEST001_EXPORT(我自己测试不加也行): 3 crtl+B 或者点击左下角锤子 进行编译…...
