【算法-位运算】位运算遍历 LogTick 算法
文章目录
- 1. 引入
- 2. LogTick 优化遍历过程
- 3. 题目
- 3.1 LeetCode3097 或值至少为 K 的最短子数组 II
- 3.2 LeetCode2411 按位或最大的最小子数组长度
- 3.3 LeetCode3209 子数组按位与值为 K 的数目
- 3.4 LeetCode3171 找到按位或最接近 K 的子数组
- 3.5 LeetCode1521 找到最接近目标值的函数值
- 3.6 LeetCode898 子数组按位或操作
1. 引入
最近刷题做到了位运算的题目,不得不感叹有时候这些题目写法简单是真的简单,但是思路也是真的难想,下面就来看下最新学到的一个算法 LogTick,这个算法是专门用于子数组求 or 或者 and 这些集合交集并集用的。
LogTick 可以用于计算连续子数组的 or 值,比如给定一个数组 [0 … L … R … len - 1],需要求出这个数组中任意一个 [L … R] 这个范围数组的 or 值,如何求呢?
最简单的方法是暴力,直接遍历,下面是遍历的双重 for 循环框架。
for(int i = 0; i < len; i++){for(int j = i - 1; j >= 0; j--){...}
}
这遍历的逻辑可以用下面例子直观解释:
- 当 i = 0 的时候,不处理
- 当 i = 1 的时候,会设置
nums[0] |= nums[1],这样就能求出 [0, 1] 的子数组或 - 当 i = 2 的时候,从后往前遍历设置
nums[1] |= nums[2],nums[0] |= nums[1],这样就能求出 [1, 2]、[0, 2] 的子数组或 - 当 i = 3 的时候,从后往前遍历设置
nums[2] |= nums[3],nums[1] |= nums[2],nums[0] |= nums[1],这样就能求出 [2, 3]、[1, 3]、[0, 3] 的子数组或运算 - …
那么完整的写法是:
public int minimumDifference(int[] nums, int k) {for(int i = 0; i < nums.length; i++){int x = nums[i];for(int j = i - 1; j >= 0; j --){nums[j] |= x;}}
}
其实这里代码实现和上面例子解释的实现不太一样,上面例子解释是从后往前一直往前 or,但是给出的实现是只对 x 进行 or,其实是一样的,因为
- 当 i = 0,不处理
- 当 i = 1,
nums[0] |= nums[1] - 当 i = 2,
nums[1] |= nums[2],nums[0] |= nums[2]等同于nums[0] | nums[1] | nums[2],因为在 i = 1 的时候就已经合并 nums[1] 到 nums[0] 了 - …
2. LogTick 优化遍历过程
上面的例子中时间复杂度是 O(logn),这样一来如果数组长度是 10^5 次方就会超时,有没有什么办法优化时间复杂度呢?
对于二进制来说,a | b 其实就是把 a 和 b 二进制里面的 1 求并集,那么从并集的角度去看上面的流程:
- 当 i = 0 的时候,不处理
- 当 i = 1 的时候,会设置 nums[0] |= nums[1],这样 n u m s [ 0 ] ⊇ n u m s [ 1 ] nums[0] \supseteq nums[1] nums[0]⊇nums[1],就是 nums[0] 集合里面包括 nums[1]
- 当 i = 2 的时候,会设置 nums[1] |= nums[2],nums[0] |= nums[1],这样 n u m s [ 0 ] ⊇ n u m s [ 1 ] , n u m s [ 1 ] ⊇ n u m s [ 2 ] = > n u m s [ 0 ] ⊇ n u m s [ 1 ] ⊇ n u m s [ 2 ] nums[0] \supseteq nums[1], nums[1] \supseteq nums[2] => nums[0] \supseteq nums[1] \supseteq nums[2] nums[0]⊇nums[1],nums[1]⊇nums[2]=>nums[0]⊇nums[1]⊇nums[2]
再把上面的代码贴下来方便观看。
public int minimumDifference(int[] nums, int k) {for(int i = 0; i < nums.length; i++){int x = nums[i];for(int j = i - 1; j >= 0; j --){nums[j] |= x;}}
}
这个代码就是暴力的代码,我们直接看内层循环,注意 nums[j] |= x 这行代码,这行代码的本意是将 x 合并到 nums[j] 中,那么仔细想想,假设第一次遍历的时候(j = i - 1),nums[j] | x = nums[j],这时候还需要 j – 再往前遍历吗?
其实是不需要的,因为 n u m s [ 0 ] ⊇ n u m s [ 1 ] ⊇ n u m s [ 2 ] nums[0] \supseteq nums[1] \supseteq nums[2] nums[0]⊇nums[1]⊇nums[2],我们现在假设 x = nums[3],那么对于 j 从 i - 1 就是 2 开始往前遍历,如果 nums[2] | nums[3] == nums[2],那么说明 nums[3] 就是 nums[2] 的一个子集,这样的话 nums[3] 自然就是 nums[1] 的子集,这种情况下根本没必要继续向前遍历执行 nums[j] |= x,从而我们就能直接跳过 2 次遍历了。
那么上面解释之后我们就能写出最终代码了,也就是 LogTick 的代码:
public int minimumDifference(int[] nums, int k) {for(int i = 0; i < nums.length; i++){int x = nums[i];for(int j = i - 1; j >= 0 && (nums[j] | x) != nums[j]; j --){nums[j] |= x;}}
}
其实相比暴力的解法就是判断条件多了一个 nums[j] | x != nums[j]。
3. 题目
以下题目都来自灵神的题单,分享丨【题单】位运算(基础/性质/拆位/试填/恒等式/思维)
3.1 LeetCode3097 或值至少为 K 的最短子数组 II
3097 或值至少为 K 的最短子数组 II
给你一个 非负 整数数组 nums 和一个整数 k 。
如果一个数组中所有元素的按位或运算 OR 的值 至少 为 k ,那么我们称这个数组是 特别的 。
请你返回 nums 中最短特别非空子数组的长度,如果特别子数组不存在,那么返回 -1 。
示例 1:
输入: nums = [1,2,3], k = 2
输出: 1
解释: 子数组[3]的按位OR值为3,所以我们返回1。
示例 2:
输入: nums = [2,1,8], k = 10
输出: 3
解释: 子数组[2,1,8]的按位OR值为11,所以我们返回3。
示例 3:
输入: nums = [1,2], k = 0
输出: 1
解释: 子数组[1]的按位OR值为1,所以我们返回1。
提示:
- 1 <= nums.length <= 2 ∗ 1 0 5 2 * 10^{5} 2∗105
- 0 <= nums[i] <= 1 0 9 10^{9} 109
- 0 <= k <= 1 0 9 10^{9} 109
思路:
找到最短的子数组,所以没什么好说的,直接用 LogTick 算法找最短子数组即可,为什么可以用 LogTick 呢?因为如果 nums[j] | nums[i] = nums[j],此时 nums[j] >= x,那么对于 j 前面的下标肯定也是 >= x 的,因为 n u m s [ 0 ] ⊇ n u m s [ 1 ] . . . ⊇ n u m s [ j − 1 ] ⊇ n u m s [ j ] nums[0] \supseteq nums[1] ... \supseteq nums[j-1]\supseteq nums[j] nums[0]⊇nums[1]...⊇nums[j−1]⊇nums[j]。
所以这时候就没必要继续往前遍历了,下面看代码。
class Solution {public int minimumSubarrayLength(int[] nums, int k) {int res = Integer.MAX_VALUE;for (int i = 0; i < nums.length; i++) {int x = nums[i];if (x >= k) {return 1;}// logTickfor (int j = i - 1; j >= 0 && (nums[j] | x) != nums[j]; j--) {nums[j] |= x;if(nums[j] >= k){res = Math.min(res, i - j + 1);}}}return res == Integer.MAX_VALUE ? -1 : res;}
}

3.2 LeetCode2411 按位或最大的最小子数组长度
按位或最大的最小子数组长度
给你一个长度为 n 下标从 0 开始的数组 nums,数组中所有数字均为非负整数。对于 0 到 n - 1 之间的每一个下标 i,你需要找出 nums 中一个 最小 非空子数组,它的起始位置为 i (包含这个位置),同时有 最大 的 按位或运算值 。
- 换言之,令 B i j B_{ij} Bij 表示子数组
nums[i...j]的按位或运算的结果,你需要找到一个起始位置为i的最小子数组,这个子数组的按位或运算的结果等于 m a x ( B i j ) max(B_{ij}) max(Bij) ,其中i <= k <= n - 1。
一个数组的按位或运算值是这个数组里所有数字按位或运算的结果。
请你返回一个大小为 n 的整数数组 answer,其中 answer[i] 是开始位置为 i,按位或运算结果最大,且 最短 子数组的长度。
子数组 是数组里一段连续非空元素组成的序列。
示例 1:
输入: nums = [1,0,2,1,3]
输出: [3,3,2,2,1]
解释: 任何位置开始,最大按位或运算的结果都是 3 。
- 下标 0 处,能得到结果 3 的最短子数组是 [1,0,2] 。
- 下标 1 处,能得到结果 3 的最短子数组是 [0,2,1] 。
- 下标 2 处,能得到结果 3 的最短子数组是 [2,1] 。
- 下标 3 处,能得到结果 3 的最短子数组是 [1,3] 。
- 下标 4 处,能得到结果 3 的最短子数组是 [3] 。
所以我们返回 [3,3,2,2,1] 。
示例 2:
输入: nums = [1,2]
输出: [2,1]
解释:
- 下标 0 处,能得到最大按位或运算值的最短子数组长度为 2 。
- 下标 1 处,能得到最大按位或运算值的最短子数组长度为 1 。
所以我们返回 [2,1] 。
示例 3:
输入: nums = [1,2], k = 0
输出: 1
解释: 子数组[1]的按位OR值为1,所以我们返回1。
提示:
- n == nums.length
- 1 <= n <= 1 0 5 10^{5} 105
- 0 <= nums[i] <= 1 0 9 10^{9} 109
class Solution {public int[] smallestSubarrays(int[] nums) {// 从右向左的 logTickint[] res = new int[nums.length];for (int i = 0; i < nums.length; i++) {res[i] = 1;for (int j = i - 1; j >= 0 && (nums[j] | nums[i]) != nums[j]; j--) {nums[j] |= nums[i];res[j] = i - j + 1;}}return res;}
}

3.3 LeetCode3209 子数组按位与值为 K 的数目
子数组按位与值为 K 的数目
给你一个整数数组 nums 和一个整数 k ,请你返回 nums 中有多少个
子数组满足:子数组中所有元素按位 AND 的结果为 k。
示例 1:
输入: nums = [1,1,1], k = 1
输出: 6
解释: 所有子数组都只含有元素 1 。
示例 2:
输入: nums = [1,1,2], k = 1
输出: 3
解释: 按位AND值为 1 的子数组包括:[1],[1],[1,1]。
示例 3:
输入: nums = [1,2,3], k = 2
输出: 2
解释: 按位AND值为 2 的子数组包括:[2],[2,3]。
思路:
其他几道题目都是使用 LogTick 来计算或运算,但是 AND 运算也是一样的,来看下下面的遍历过程:
- 当 i = 0 的时候,不处理
- 当 i = 1 的时候,nums[0] &= nums[1],这时候 n u m s [ 0 ] ⊆ n u m s [ 1 ] nums[0] \subseteq nums[1] nums[0]⊆nums[1]
- 当 i = 2 的时候,nums[1] &= nums[2],nums[0] &= nums[1],这时候 n u m s [ 0 ] ⊆ n u m s [ 1 ] ⊆ n u m s [ 2 ] nums[0] \subseteq nums[1] \subseteq nums[2] nums[0]⊆nums[1]⊆nums[2]
- …
其实就是换个方向而已,从上面的关系可以看到,假设当 i = m 的时候,nums[m - 1] &= nums[i] 之后,nums[m - 1] < k,这时候还需要向前去找等于 k 的值吗?
不需要,因为 & 只会越 AND 越小。 根据这个特性,可以设置一个 left 和 right 指针,都指向 0,每一次遍历使用 left 指向第一个等于 k 的下标,right 指向第一个 > k 的下标,这样一来,right - left 就是等于 k 的数目。
假设当 i = m 的时候,left 指向 i1,right 指向 i2,所以这时候 nums[left] = k,i2 - i1 就是以 i = m 为结尾的子数组个数,而当 i = m + 1 的时候,由于 AND 越 AND 越小的特点,nums[left] & nums[i] 只会更小,left 要想找到等于 k 的下标,只能继续往右遍历,所以这就是 left 和 right 的单调性,依靠这个特点,我们就能写出下面代码。
class Solution {public long countSubarrays(int[] nums, int k) {long res = 0;int left = 0, right = 0;for (int i = 0; i < nums.length; i++) {for (int j = i - 1; j >= 0 && (nums[i] & nums[j]) != nums[j]; j--) {nums[j] &= nums[i];}while(left <= i && nums[left] < k){left++;}while(right <= i && nums[right] <= k){right++;}// left 指向第一个 k,right 指向第一个 k + 1的值res += (right - left);}return res;}
}
上面的代码通过 left 和 right 求出等于 k 的个数,其实如果不用 left 和 right,也可以用二分法,主要就是使用二分法计算出等于 k 的左下标和右下标,但是使用二分就没有用到 left 的单调写法,时间复杂度会去到 O(nlogn),这里二分写法如下:
class Solution {public long countSubarrays(int[] nums, int k) {long res = 0;for (int i = 0; i < nums.length; i++) {for (int j = i - 1; j >= 0 && (nums[i] & nums[j]) != nums[j]; j--) {nums[j] &= nums[i];}int left = search(nums, 0, i, k);int right = search(nums, 0, i, k + 1);// left 指向第一个 k,right 指向第一个 k + 1的值res += (right - left);}return res;}public int search(int[] nums, int left, int right, int k){while(left <= right){int mid = left + ((right - left) >> 1);if(nums[mid] >= k){right = mid - 1;} else {left = mid + 1;}}return left;}
}
3.4 LeetCode3171 找到按位或最接近 K 的子数组
找到按位或最接近 K 的子数组
给你一个数组 nums 和一个整数 k 。你需要找到 nums 的一个 子数组 ,满足子数组中所有元素按位或运算 OR 的值与 k 的 绝对差 尽可能 小 。换言之,你需要选择一个子数组 nums[l..r] 满足 |k - (nums[l] OR nums[l + 1] ... OR nums[r])| 最小。
请你返回 最小 的绝对差值。
子数组 是数组中连续的 非空 元素序列。
示例 1:
输入: nums = [1,2,4,5], k = 3
输出: 0
解释: 子数组nums[0..1]的按位OR运算值为 3 ,得到最小差值|3 - 3| = 0。
示例 2:
输入: nums = [1,3,1,3], k = 2
输出: 1
解释: 子数组nums[1..1]的按位OR运算值为 3 ,得到最小差值|3 - 2| = 1。
示例 3:
输入: nums = [1], k = 10
输出: 9
解释: 只有一个子数组,按位OR运算值为 1 ,得到最小差值|10 - 1| = 9。
提示:
- 1 <= nums.length <= 1 0 5 10^{5} 105
- 1 <= nums[i] <= 1 0 9 10^{9} 109
- 1 <= k <= 1 0 9 10^{9} 109
思路:
LogTick 往前遍历,要求最小,那么如果 nums[j] | nums[i] = nums[j],这时候 nums[j] - k 和 nums[j - 1] - k … nums[0] - k 是一样的,所以就没必要继续往前遍历了。
class Solution {// LogTickpublic int minimumDifference(int[] nums, int k) {int ans = Integer.MAX_VALUE;for(int i = 0; i < nums.length; i++){int x = nums[i];ans = Math.min(ans, Math.abs(x - k));for(int j = i - 1; j >= 0 && ((nums[j] | x) != nums[j]); j --){nums[j] |= x;ans = Math.min(ans, Math.abs(nums[j] - k));}}return ans;}
}

3.5 LeetCode1521 找到最接近目标值的函数值
找到最接近目标值的函数值

Winston 构造了一个如上所示的函数 func。他有一个整数数组 arr 和一个整数 target,他想找到让 |func(arr, l, r) - target| 最小的 l 和 r 。
请你返回 |func(arr, l, r) - target| 的最小值。
请注意, func 的输入参数 l 和 r 需要满足 0 <= l, r < arr.length。
示例 1:
输入: arr = [9,12,3,7,15], target = 5
输出: 2
解释: 所有可能的 [l,r] 数对包括 [[0,0],[1,1],[2,2],[3,3],[4,4],[0,1],[1,2],[2,3],[3,4],[0,2],[1,3],[2,4],[0,3],[1,4],[0,4]], Winston 得到的相应结果为 [9,12,3,7,15,8,0,3,7,0,0,3,0,0,0] 。最接近 5 的值是 7 和 3,所以最小差值为 2 。
示例 2:
输入: arr = [1000000,1000000,1000000], target = 1
输出: 999999
解释: Winston 输入函数的所有可能 [l,r] 数对得到的函数值都为 1000000 ,所以最小差值为 999999。
示例 3:
输入: arr = [1,2,4,8,16], target = 0
输出: 0
提示:
- 1 <= arr.length <= 1 0 5 10^{5} 105
- 1 <= arr[i] <= 1 0 6 10^{6} 106
- 0 <= target <= 1 0 7 10^{7} 107
思路:
通过 LogTick 去遍历子数组的 AND 运算结果,然后计算最小值。
class Solution {public int closestToTarget(int[] arr, int target) {int min = Integer.MAX_VALUE;for (int i = 0; i < arr.length; i++) {min = Math.min(min, Math.abs(arr[i] - target));for (int j = i - 1; j >= 0 && (arr[j] & arr[i]) != arr[j]; j--) {arr[j] &= arr[i];min = Math.min(min, Math.abs(arr[j] - target));}}return min;}
}
3.6 LeetCode898 子数组按位或操作
子数组按位或操作
给定一个整数数组 arr,返回所有 arr 的非空子数组的不同按位或的数量。
子数组的按位或是子数组中每个整数的按位或。含有一个整数的子数组的按位或就是该整数。
子数组 是数组内连续的非空元素序列。
示例 1:
输入: arr = [0]
输出: 1
解释: 只有一个可能的结果 0 。
示例 2:
输入: arr = [1,1,2]
输出: 3
解释: 可能的子数组为 [1],[1],[2],[1, 1],[1, 2],[1, 1, 2]。产生的结果为 1,1,2,1,3,3。有三个唯一值,所以答案是 3 。
示例 3:
输入: arr = [1,2,4]
输出: 6
解释: 可能的结果是 1,2,3,4,6,以及 7。
提示:
- 1 <= arr.length <= 1 0 5 10^{5} 105
- 1 <= arr[i] <= 1 0 6 10^{6} 106
- 0 <= target <= 1 0 7 10^{7} 107
代码:
class Solution {public int subarrayBitwiseORs(int[] arr) {HashSet<Integer> set = new HashSet<>();for (int i = 0; i < arr.length; i++) {int x = arr[i];set.add(x);for (int j = i - 1; j >= 0 && (arr[j] | x) != arr[j]; j--) {arr[j] |= x;set.add(arr[j]);}}return set.size();}
}
如有错误,欢迎指出!!!
相关文章:
【算法-位运算】位运算遍历 LogTick 算法
文章目录 1. 引入2. LogTick 优化遍历过程3. 题目3.1 LeetCode3097 或值至少为 K 的最短子数组 II3.2 LeetCode2411 按位或最大的最小子数组长度3.3 LeetCode3209 子数组按位与值为 K 的数目3.4 LeetCode3171 找到按位或最接近 K 的子数组3.5 LeetCode1521 找到最接近目标值的函…...
【memgpt】letta 课程4:基于latta框架构建MemGpt代理并与之交互
Lab 3: Building Agents with memory 基于latta框架构建MemGpt代理并与之交互理解代理状态,例如作为系统提示符、工具和agent的内存查看和编辑代理存档内存MemGPT 代理是有状态的 agents的设计思路 每个步骤都要定义代理行为 Letta agents persist information over time and…...
Python的那些事第九篇:从单继承到多继承的奇妙之旅
Python 继承:从单继承到多继承的奇妙之旅 目录 Python 继承:从单继承到多继承的奇妙之旅 一、引言 二、继承的概念与语法 三、单继承 四、多继承 五、综合代码示例 六、总结 一、引言 在编程的世界里,继承就像是一场神奇的魔法&#…...
Excel to form ?一键导入微软表单
一句话痛点 “你的Excel越强大,手动复制到Forms就越痛苦。” 合并单元格崩溃成乱码、下拉菜单变纯文本、条件逻辑消失无踪——这些不是技术问题,而是低效工作模式的死刑判决书。 直击解决方案:3分钟,3步,300%效率 1…...
pandas(三)Series使用
一、Series基础使用 import pandasd {x:100,y:200,z:300} s1 pandas.Series(d) #将dict转化为Series print(s1)print("") l1 [1, 2, 3] l2 [a, b, c] s2 pandas.Series(l1, indexl2) #list转为Series print(s2)print("") s3 pandas.Series([11…...
Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)
文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、使用Chatbox进行交互5.1 下载Chatbox安装包…...
从零开始学 HTML:构建网页的基本框架与技巧
系列文章目录 01-从零开始学 HTML:构建网页的基本框架与技巧 文章目录 系列文章目录前言一、HTML 文档的基本框架1.1 <!DOCTYPE html>、<html>、<head>、<body> 标签解析1.1.1 <!DOCTYPE html> 标签1.1.2 <html> 标签1.1.3 &l…...
如何用微信小程序写春联
生活没有模板,只需心灯一盏。 如果笑能让你释然,那就开怀一笑;如果哭能让你减压,那就让泪水流下来。如果沉默是金,那就不用解释;如果放下能更好地前行,就别再扛着。 一、引入 Vant UI 1、通过 npm 安装 npm i @vant/weapp -S --production 2、修改 app.json …...
2025最新在线模型转换工具onnx转换ncnn,mnn,tengine等
文章目录 引言最新网址地点一、模型转换1. 框架转换全景图2. 安全的模型转换3. 网站全景图 二、转换说明三、模型转换流程图四、感谢 引言 在yolov5,yolov8,yolov11等等模型转换的领域中,时间成本常常是开发者头疼的问题。最近发现一个超棒的…...
算法每日双题精讲 —— 前缀和(【模板】一维前缀和,【模板】二维前缀和)
在算法竞赛与日常编程中,前缀和是一种极为实用的预处理技巧,能显著提升处理区间和问题的效率。今天,我们就来深入剖析一维前缀和与二维前缀和这两个经典模板。 一、【模板】一维前缀和 题目描述 给定一个长度为 n n n 的整数数组 a a a&…...
C++泛型编程指南03-CTAD
文章目录 C17 自定义类型推断指引(CTAD)深度解析一、基础概念1. 核心作用2. 工作原理 二、标准库中的 CTAD 应用1. 容器类型推导2. 智能指针推导3. 元组类型推导 三、自定义推导指引语法1. 基本语法结构2. 典型应用场景 四、推导指引设计模式1. 迭代器范…...
记8(高级API实现手写数字识别
目录 1、Keras:2、Sequential模型:2.1、建立Sequential模型:modeltf.keras.Sequential()2.2、添加层:model.add(tf.keras.layers.层)2.3、查看摘要:model.summary()2.4、配置训练方法:model.compile(loss,o…...
88.[4]攻防世界 web php_rce
之前做过,回顾(看了眼之前的wp,跟没做过一样) 属于远程命令执行漏洞 在 PHP 里,system()、exec()、shell_exec()、反引号()等都可用于执行系统命令。 直接访问index.php没效果 index.php?sindex/think\a…...
23.Word:小王-制作公司战略规划文档❗【5】
目录 NO1.2.3.4 NO5.6 NO7.8.9 NO10.11 NO12 NO13.14 NO1.2.3.4 布局→页面设置对话框→纸张:纸张大小:宽度/高度→页边距:上下左右→版式:页眉页脚→文档网格:勾选只指定行网格✔→ 每页:…...
在Arm芯片苹果Mac系统上通过homebrew安装多版本mysql并解决各种报错,感谢deepseek帮助解决部分问题
背景: 1.苹果设备上安装mysql,随着苹果芯片的推出,很多地方都变得不一样了。 2.很多时候为了老项目能运行,我们需要能安装mysql5.7或者mysql8.0或者mysql8.2.虽然本文编写时最新的默认mysql已经是9.2版本。 安装步骤 1.执行hom…...
C++【iostream】数据库的部分函数功能介绍
在 C 编程世界中,iostream 库扮演着举足轻重的角色,它是 C 标准库的核心组成部分,为程序提供了强大的输入输出功能。无论是简单的控制台交互,还是复杂的文件操作,iostream 库都能提供便捷高效的解决方案。本文将深入剖…...
数据结构 树1
目录 前言 一,树的引论 二,二叉树 三,二叉树的详细理解 四,二叉搜索树 五,二分法与二叉搜索树的效率 六,二叉搜索树的实现 七,查找最大值和最小值 指针传递 vs 传引用 为什么指针按值传递不会修…...
【实战篇章】深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据
文章目录 深入探讨:服务器如何响应前端请求及后端如何查看前端提交的数据一、服务器如何响应前端请求HTTP 请求生命周期全解析1.前端发起 HTTP 请求(关键细节强化版)2. 服务器接收请求(深度优化版) 二、后端如何查看前…...
玩转ChatGPT:DeepSeek测评(科研思路梳理)
一、写在前面 DeepSeek-R1出圈了,把OpenAI的o3-mini模型都提前逼上线了(还免费使用)。 都号称擅长深度推理,那么对于科研牛马的帮助有多大呢? 我连夜试一试。 二、科研思路梳理 有时候我们牛马们做了一堆结果以后&…...
python学opencv|读取图像(五十三)原理探索:使用cv.matchTemplate()函数实现最佳图像匹配
【1】引言 前序学习进程中,已经探索了使用cv.matchTemplate()函数实现最佳图像匹配的技巧,并且成功对两个目标进行了匹配。 相关文章链接为:python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像…...
AJAX RSS Reader:技术解析与应用场景
AJAX RSS Reader:技术解析与应用场景 引言 随着互联网的快速发展,信息量呈爆炸式增长。为了方便用户快速获取感兴趣的信息,RSS(Really Simple Syndication)技术应运而生。AJAX RSS Reader作为一种基于AJAX技术的信息读取工具,在用户体验和信息获取方面具有显著优势。本…...
Linux环境下的Java项目部署技巧:安装 Mysql
查看 myslq 是否安装: rpm -qa|grep mysql 如果已经安装,可执行命令来删除软件包: rpm -e --nodeps 包名 下载 repo 源: http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm 执行命令安装 rpm 源(根据下载的…...
gitea - fatal: Authentication failed
文章目录 gitea - fatal: Authentication failed概述run_gitea_on_my_pkm.bat 笔记删除windows凭证管理器中对应的url认证凭证启动gitea服务端的命令行正常用 TortoiseGit 提交代码备注END gitea - fatal: Authentication failed 概述 本地的git归档服务端使用gitea. 原来的用…...
计算机网络安全与运维的关键 —— 常用端口全解析
目录 前言 常见端口分类及用途 20 端口(FTP 数据传输) 21 端口(FTP 消息控制) 22 端口(SSH) 23 端口(Telnet) 25 端口(SMTP) 53 端口(DNS&…...
JavaScript Navigator:深入理解浏览器导航机制
JavaScript Navigator:深入理解浏览器导航机制 引言 在Web开发中,浏览器导航是用户与网页交互的重要部分。JavaScript Navigator对象提供了丰富的API,允许开发者深入理解并控制浏览器的导航行为。本文将详细介绍JavaScript Navigator对象的功能、使用方法以及在实际开发中…...
笔灵ai写作技术浅析(三):深度学习
笔灵AI写作的深度学习技术主要基于Transformer架构,尤其是GPT(Generative Pre-trained Transformer)系列模型。 1. Transformer架构 Transformer架构由Vaswani等人在2017年提出,是GPT系列模型的基础。它摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),完全依赖自…...
Linux-CentOS的yum源
1、什么是yum yum是CentOS的软件仓库管理工具。 2、yum的仓库 2.1、yum的远程仓库源 2.1.1、国内仓库 国内较知名的网络源(aliyun源,163源,sohu源,知名大学开源镜像等) 阿里源:https://opsx.alibaba.com/mirror 网易源:http://mirrors.1…...
< OS 有关> BaiduPCS-Go 程序的 菜单脚本 Script: BaiduPCS-Go.Menu.sh (bdgo.sh)
目标: 使用 日本阿里云的 VPM 传输文件。 暂时方案: 使用 主机JPN 下载 https://huggingface.co/ 上模型从 JPN 放到 度狗上在家里从狗度下载 为了减少编程,尽量使用现在软件 ,就找到 GitHub - qjfoidnh/BaiduPCS-Go: iikira…...
【前端学习路线】前端优化 详细知识点学习路径(附学习资源)
📚学习资源: 前端开发:零基础入门到项目实战 >> 前端开发:边学边练 >> 原学习路径下载 >>...
deepseek v3 搭建个人知识库
目录 deepseek-r1本地部署,这个比较好,推荐 Chatbox连接ollama服务 知乎教程,需要注册: deepseek-r1本地部署,这个比较好,推荐 公司数据不泄露,DeepSeek R1本地化部署web端访问个人知识库搭建…...
