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

【算法题】算法一本通

每周更新至完结,建议关注收藏点赞。

目录

  • 待整理文章
  • 已整理的文章
  • 方法论
  • 思想总结
  • 模版工具总结
    • 排序
  • 数组与哈希表
  • 双指针(滑动窗口、二分查找、链表)
  • 前缀树
  • 堆 优先队列(区间/间隔问题、贪心 )
  • 回溯
  • 一维DP
  • 位操作
  • 数学与几何学
  • 二维DP
  • 随缘更新:高级图论

待整理文章

CodeCreek
[题单]
算法专栏

已整理的文章

以前发布的算法题文章都会汇总在这里,重新整理复习,优化内容,并注明出处。
本文所选题目均含有原题地址。以JS为主,补充其他语言代码。
算法题第一弹
算法题第二弹
算法题第三弹

部分代码借鉴灵神

方法论

超过10分钟就要看题解
动态规划做100道才算入门
按照专题分类,每专题做完进行总结->按分类拓扑图顺序从前往后->定期复习。
在这里插入图片描述

  • 由上面拓扑图可以得到顺序:
  1. 数组与哈希表
  2. 双指针(滑动窗口、二分查找、链表)
  3. 前缀树
  4. 堆 优先队列(区间/间隔问题、贪心 )
  5. 回溯
  6. 一维DP
  7. 位操作
  8. 数学与几何学
  9. 二维DP
  10. 随缘更新:高级图论

思想总结

  • 空间换时间

模版工具总结

  • 哈希表:O(1) 快速找到元素
  • 集合Set:O(n) 快速去重
  • KMP:O(m+n) 找子串(模式串)
    核心思想就是根据子串的相同前后缀,标记“子串回退的下标”,便于回退。例如:字符串 aabaaab的前缀函数值依次为 0,1,0,1,2,2,3。
var strStr = function(haystack, needle) {//母串,子串const n = haystack.length, m = needle.length;if (m === 0) {return 0;}const pi = new Array(m).fill(0);//制作next数组//pi[0]必然是0,所以i从1开始for (let i = 1, j = 0; i < m; i++) {while (j > 0 && needle[i] !== needle[j]) {j = pi[j - 1];}if (needle[i] == needle[j]) {j++;}pi[i] = j;}//字符串匹配for (let i = 0, j = 0; i < n; i++) {while (j > 0 && haystack[i] != needle[j]) {j = pi[j - 1];}if (haystack[i] == needle[j]) {j++;}if (j === m) {return i - m + 1;}}return -1;
};

排序

堆排序
桶排序

数组与哈希表

  1. 两数之和
    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数的下标。
    用哈希表记录值和下标,在遍历过程中判断[目标值减当前值]是否已存在
    坑:先查再放,否则会匹配到自己
//js
var twoSum = function(nums, target) {const idx = new Map(); // 创建一个空哈希表for (let j = 0; ; j++) { // 枚举 jconst x = nums[j];// 在左边找 nums[i],满足 nums[i]+x=targetif (idx.has(target - x)) { // 找到了return [idx.get(target - x), j]; // 返回两个数的下标}idx.set(x, j); // 保存 nums[j] 和 j}
};
  1. 存在重复元素
//js
var containsDuplicate = function(nums) {return new Set(nums).size < nums.length;
};
  1. 有效的字母异位词
    用字符的ascii码作为下标,值为出现的次数,比对两个数组的值
//js
var isAnagram = function(s, t) {const cnt = Array(26).fill(0);for (const c of s) {cnt[c.charCodeAt(0) - 'a'.charCodeAt(0)]++;}for (const c of t) {cnt[c.charCodeAt(0) - 'a'.charCodeAt(0)]--;}return cnt.every(c => c === 0);
}//by the way:return _.isEqual(cntS, cntT);//深比较//_代表库别名,最常见的是 Lodash 或 Underscore.js库函数。
  1. 字母异位词分组
    字母异位词分组:就是把字母及数目相同,顺序不同的单词放到一组
    用排序后的字符串作为 key 分组,哈希表记录分组
    时间复杂度:O(n * k log k)
//js
var groupAnagrams = function(strs) {const m = new Map();for (const s of strs) {// 把 s 排序,作为哈希表的 keyconst sortedS = s.split('').sort().join('');if (!m.has(sortedS)) {m.set(sortedS, []);}// 排序后相同的字符串分到同一组m.get(sortedS).push(s);}// 哈希表的 value 保存分组后的结果return Array.from(m.values());
};
  1. 除自身以外数组的乘积
    构建两个数组,前缀乘积pre、后缀乘积post,答案就等于它们相乘。
    优化:要求O(1) 的额外空间复杂度,输出数组不被视为额外空间
    先计算post,后计算pre,把pre直接乘到post中,最后返回post,相当于post直接作为answer
    上述无论怎么优化,都至少需要两个先后的循环
  2. 前 K 个高频元素
    两种方法,堆、桶排序。补充
    JS可以直接通过Map+Array做出来
let topKFrequent = function(nums, k) {let map = new Map(), arr = [...new Set(nums)]nums.map((num) => {if(map.has(num)) map.set(num, map.get(num)+1)else map.set(num, 1)})return arr.sort((a, b) => map.get(b) - map.get(a)).slice(0, k);
};
  1. 有效的数独
  2. 最长连续序列
    这个题目不能排序,因为要求O(n)时间复杂度
  • 核心思路:
    1)找起点:对于 nums 中的元素 x,如果有x-1,起点为x-1,以此类推,得到起点。
    2)统计序列长度:每次找到起点y,不断查找下一个数 y+1,y+2,⋯ 是否在 nums 中,并更新序列长度。
var longestConsecutive = function(nums) {let ans = 0;const st = new Set(nums); // 把 nums 转成哈希集合for (const x of st) { // 遍历哈希集合if (st.has(x - 1)) {continue;}// x 是序列的起点let y = x + 1;while (st.has(y)) { // 不断查找下一个数是否在哈希集合中y++;}// 循环结束后,y-1 是最后一个在哈希集合中的数ans = Math.max(ans, y - x); // 从 x 到 y-1 一共 y-x 个数}return ans;
};
  1. 整数反转
//js
Number.parseInt('123-')//好处在于它不会理会后面的非法字符,返回123var reverse = function(x) {    let re=x>=0 ? Number.parseInt(x.toString().split('').reverse().join('')) : Number.parseInt('-'+x.toString().split('').reverse().join(''))re=re<(-2)**31 || re>(2**31)-1 ? 0 : re    return re;
};
  1. 罗马整数
    本题的难点在于处理六种特殊规则,但可以统一规则:
    设 x=s[i−1], y=s[i],这是两个相邻的罗马数字。
    如果 x 的数值小于 y 的数值,那么 x 的数值要取相反数。例如 IV 中的 I 相当于 −1。
    把所有数值相加,即为答案。
//js
const ROMAN = {'I': 1,'V': 5,'X': 10,'L': 50,'C': 100,'D': 500,'M': 1000,
};var romanToInt = function(s) {let ans = 0;for (let i = 1; i < s.length; i++) { // 遍历相邻的罗马数字const x = ROMAN[s[i - 1]], y = ROMAN[s[i]];ans += x < y ? -x : x;}return ans + ROMAN[s[s.length - 1]]; // 加上最后一个
};
  1. 展开与压缩序列:报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
  2. 1
    
  3. 11
    
  4. 21
    
  5. 1211
    
  6. 111221
    

1 被读作 “one 1” (“一个一”) , 即 11。
11 被读作 “two 1s” (“两个一”), 即 21。
21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
理解题意则很好写。规则:
1)有连续重复的则统计次数cnt++
2)无连续重复的,放入cnt,放入当前字符

var countAndSay = function(n) {let res=['','1','11','21','1211'];if(n<5)return res[n];for (let i=4;i<=n;i++){let str=res[i];let n=str.length;let res_temp='';let count=1;for(let j=0;j<n;j++){if(str[j]==str[j+1])count+=1;else{res_temp+=`${count}${str[j]}`;count=1;}}res.push(res_temp);//console.log(res);}return res[n];
};

  1. 括号匹配
//最简洁代码
var isValid = function(s) {    let origin=s;    while(s.length){s=origin.replace('()','').replace('[]','').replace('{}',''); if(s==origin)return false;        origin=s;    }    return true;
};

双指针(滑动窗口、二分查找、链表)

  1. 二分查找
var search = function(nums, target) {let left = 0, right = nums.length - 1;while (left <= right) {const mid = Math.floor((right + left) / 2);const num = nums[mid];if (num === target) {return mid;} else if (num > target) {right = mid - 1;} else {left = mid + 1;}}return -1;
};
  1. 原地删除排序数组中的重复元素,返回移除后数组的新长度。
    要求 O(1) 额外空间
var removeDuplicates = function(nums) {let i=0,j=1;while(j!=nums.length){if(nums[i]==nums[j])j+=1;else{i+=1;nums[i]=nums[j];j+=1}}return i+1;
};
  1. 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。假设数组中无重复元素。
var searchInsert = function(nums, target) {let i=0,j=nums.length-1;while(i<=j){let mid=(i+j)>>1;//位运算提高性能if(nums[mid]==target)return mid;else if(nums[mid]<target)i=mid+1;else j=mid-1;}return i;
};
  1. 合并两个有序链表
    递归最简单
var mergeTwoLists = function(l1, l2) {    if (l1 === null) return l2;    else if (l2 === null) return l1;else if (l1.val < l2.val) {        l1.next = mergeTwoLists(l1.next, l2);        return l1;    } else {        l2.next = mergeTwoLists(l1, l2.next);        return l2;    }
};

前缀树

堆 优先队列(区间/间隔问题、贪心 )

回溯

  1. 数独游戏
    玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。
    保证所有已知数据的格式都是合法的,并且题目有唯一的解。
    格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知。
    输出9行,每行9个数字表示数独的解。例如:
    在这里插入图片描述
#include <stdio.h>
int a[9][9];int place(int x, int y) //二者分别是数组对应的行地址和列地址,取值为0-8
{int up, down, left, right;int i,j;up=x/3*3; //计算同色格子的范围down=up+3;left=y/3*3;right=left+3;//以下分三种情况判断是否在x,y对应的位置放这个数,如果不可以放,返回0,如果可以放,返回1,会进一步迭代for(i=0;i<9;i++){if(a[x][y]==a[i][y] && i!=x && a[i][y]!=0)return 0;		}for(i=0;i<9;i++){if (a[x][y]==a[x][i] && i!=y && a[x][i]!=0)return 0;		}for(i=up;i<down;i++)//同色9宫格的情况{for(j=left;j<right;j++)if(i!=x || j!=y)//不是自己即可{if(a[i][j]==a[x][y] && a[i][j]!=0)return 0;}}return 1;	
}void backtrack(int t)//第几个格子
{int i,j;int x,y;if(t==81){for(i=0;i<9;i++){for(j=0;j<9;j++)printf("%d",a[i][j]);		putchar('\n');}}else{x=t/9;y=t%9; //将这个转换为相应的数组行坐标和列坐标if(a[x][y]!=0)backtrack(t+1);else{for(i=1;i<10;i++){a[x][y]=i;if(place(x,y)==1)backtrack(t+1);a[x][y]=0;//回溯操作}}}
}int main()
{char str[9][9];int i,j;for(i=0;i<9;i++)gets(str[i]);for(i=0;i<9;i++)for(j=0;j<9;j++)a[i][j]=str[i][j]-'0';backtrack(0);return 0;
}
  1. 今有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。
    要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。
    如下就是一个符合要求的排列:17126425374635当然,如果把它倒过来,也是符合要求的。
    请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<stdlib.h>
#include<algorithm>
#include<cmath>
using namespace std;
int arr[16]={0};
int dfs(int n)
{if(n > 6) return 1;//因为7已经确定,所以最大放入数就是6if(n == 4) n++;//4的位置已经确定,所以跳过int i = 0;for(i = 3;i <=14 ;i++){if(i == 7 || i == 9) continue;//7,9位置值已经定了if(i+n+1 <=14 && arr[i]==0 &&arr[i+n+1]==0)//保证两个位置都没有数据{arr[i] = arr[i+n+1] = n;if(dfs(n+1))//改变数字return 1;arr[i] = arr[i+n+1] = 0;//回溯回来证明不符合条件,恢复上一次dfs状态}}return 0;
}
int main()
{arr[1] = 7,arr[2] = 4;//因为题目上已经给出两个开头,可以推出后面两个arr[9] = 7,arr[7] = 4;dfs(1);//放入数字1for(int i = 1;i < 16;i++ ){cout <<arr[i];}cout <<"\n";return 0;
}

一维DP

位操作

  1. 整数反转
    在这里插入图片描述
/*** @param {number} x* @return {number}*/
var reverse = function(x) {let result = 0;while(x !== 0) {result = result * 10 + x % 10;x = (x / 10) | 0;//通过 | 0 取整,无论正负,只移除小数点部分(正数向下取整,负数向上取整)。}return (result | 0) === result ? result : 0;//|只能处理32位内的,所以可以用来判断是否溢出32位
};
  • 为啥通过 | 0 取整,无论正负,只移除小数点部分(正数向下取整,负数向上取整)?
    在 JavaScript 中,当你对一个数字执行位运算符(如 |、&、^、~、<<、>>、>>>)时,JavaScript 引擎会执行以下步骤:
    将操作数转换为 32 位带符号整数。(故局限性也是只能处理32位带符号整数范围内)
    当一个浮点数被转换为 32 位整数时,它的小数部分会被直接截断(丢弃)。
    x | 0得到x本身,所以说这个操作只是去除小数部分。

数学与几何学

  1. x的x次幂结果为10,计算出x的近似值,这个值是介于2和3之间的一个数字。x的值计算到小数后6位(四舍五入)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<stdlib.h>
#include<algorithm>
#include<cmath>
using namespace std;int main()
{double a=2.0;for(;a<3;a+=0.0000001)//要比要求的6位小数多出一位才能四舍五入{if(fabs(pow(a,a)-10.0)<0.000001)break;}printf("%6lf",a); //lf是double格式 return 0;
}
  1. 大数勾股定理
    已知直角三角形的斜边是某个整数,并且要求另外两条边也必须是整数。求满足这个条件的不同直角三角形的个数。
    输入一个整数 n (0<n<10000000) 表示直角三角形斜边的长度。要求输出一个整数,表示满足条件的直角三角形个数。
    资源约定:
    峰值内存消耗 < 256M
    CPU消耗 < 1000ms
#include<stdio.h>
#include<math.h>
int main()
{long long n,i,j,sum=0,m;//~按位取反//使得当 scanf 读取失败时 返回EOF (-1)//-1 是 32 位整数 1...1111 (所有位都是 1) 则循环终止while(~scanf("%lld",&n)){for(i=1;i<n;i++){j=sqrt(n*n-i*i);if(j*j==n*n-i*i)sum++;}printf("%lld\n",sum/2);}return 0;}
  1. 埃及分数
    形如:1/a 的分数称为单位分数。可以把1分解为若干个互不相同的单位分数之和。
    例如:
    1 = 1/2 + 1/3 + 1/9 + 1/18
    1 = 1/2 + 1/3 + 1/10 + 1/15
    1 = 1/3 + 1/5 + 1/7 + 1/9 + 1/11 + 1/15 + 1/35 + 1/45 + 1/231
    等等,类似这样的分解无穷无尽。
    我们增加一个约束条件:最大的分母必须不超过30
    请你求出分解为n项时的所有不同分解法。
    数据格式要求:
    输入一个整数n,表示要分解为n项(n<12)
    输出分解后的单位分数项,中间用一个空格分开。
    每种分解法占用一行,行间的顺序按照分母从小到大排序。
    例如,
    输入:
    4
    程序应该输出:
    1/2 1/3 1/8 1/24
    1/2 1/3 1/9 1/18
    1/2 1/3 1/10 1/15
    1/2 1/4 1/5 1/20
    1/2 1/4 1/6 1/12
    再例如,
    输入:
    5
    程序应该输出:
    1/2 1/3 1/12 1/21 1/28
    1/2 1/4 1/6 1/21 1/28
    1/2 1/4 1/7 1/14 1/28
    1/2 1/4 1/8 1/12 1/24
    1/2 1/4 1/9 1/12 1/18
    1/2 1/4 1/10 1/12 1/15
    1/2 1/5 1/6 1/12 1/20
    1/3 1/4 1/5 1/6 1/20
    资源约定:
    峰值内存消耗 < 256M
    CPU消耗 < 2000ms

先研究一下数学原理 1=30/30
这个分母就是30,分子也是30,将分子的30做分解就可以了。列出1-29之内相加等于30的各种可能,然后将这些数和分母约分就可以了
比如:30=2+3+25
则1=(2+3+25)/30
1=1/15+1/10+5/6
加了限制项n 时,就更加好办了,就是求n个数相加等于30
等式可以认为是(a1+a2+…am)/K,很好理解,a1,…am必然是K的所有约数的和的组合。因此最后题目就是转化为求一个数K的所有约数(质因子),题目K最大才30,之后求出所有约数中,n个数的和等于K的组合。
比如:K=30,30=235,根据“约数个数定理”,约数有8个,除去自己本身和1就剩6个,为2,3,5,6,10,15,
如果你输入n=4,那么就是求这6个约数中,哪4个相加正好等于30的所有组合,根据组合原理,C(7,4)才210中组合,因此循环不会很久。
题目没规定K值,因此,需要K从1到30循环,对每一次循环的K,找出所有所有约数,并对所有约数个数不小于n的情况,循环找出所有n个约数等于K的组合。
建议搜索:
1、约数个数定理
2、求求一个数的所有约数(或者质因子)
3、从N个数中任选M个数相加的和等于K(循环应该就能解决)

二维DP

随缘更新:高级图论

相关文章:

【算法题】算法一本通

每周更新至完结&#xff0c;建议关注收藏点赞。 目录 待整理文章已整理的文章方法论思想总结模版工具总结排序 数组与哈希表栈双指针&#xff08;滑动窗口、二分查找、链表&#xff09;树前缀树堆 优先队列&#xff08;区间/间隔问题、贪心 &#xff09;回溯图一维DP位操作数学…...

Modbus转Ethernet IP赋能挤出吹塑机智能监控

在现代工业自动化领域&#xff0c;小疆智控Modbus转Ethernet IP网关GW-EIP-001与挤出吹塑机的应用越来越广泛。这篇文章将为您详细解读这两者的结合是如何提高生产效率&#xff0c;降低维护成本的。首先了解什么是Modbus和Ethernet IP。Modbus是一种串行通信协议&#xff0c;它…...

C++中如何遍历map?

文章目录 1. 使用范围for循环&#xff08;C11及以上&#xff09;2. 使用迭代器3. 使用反向迭代器注意事项 在C中&#xff0c; std::map 是一种关联容器&#xff0c;它存储的是键值对&#xff08;key-value pairs&#xff09;&#xff0c;并且按键的顺序进行排序。遍历 std::m…...

什么是终端安全管理系统(终端安全管理软件2024科普)

在当今数字化迅速发展的时代&#xff0c;企业面临着越来越多的信息安全威胁。为了应对这些挑战&#xff0c;保障公司数据的安全性和完整性&#xff0c;终端安全管理系统&#xff08;Endpoint Security Management System&#xff09;应运而生。 本文将为您深入浅出地科普2024年…...

书籍转圈打印矩阵(8)0604

题目 给定一个整型矩阵matrix&#xff0c;请按照转圈的方式打印它。 例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为&#xff1a;1&#xff0c;2&#xff0c;3&#xff…...

【JVM】Java类加载机制

【JVM】Java类加载机制 什么是类加载&#xff1f; 在 Java 的世界里&#xff0c;每一个类或接口在经过编译后&#xff0c;都会生成对应的 .class 字节码文件。 所谓类加载机制&#xff0c;就是 JVM 将这些 .class 文件中的二进制数据加载到内存中&#xff0c;并对其进行校验…...

Elasticsearch中的自定义分析器(Custom Analyzer)介绍

在 Elasticsearch 中,自定义分析器(Custom Analyzer) 是一种可配置的文本处理组件,允许用户通过组合分词器(Tokenizer)、过滤器(Token Filter)和字符过滤器(Character Filter)来定义特定的文本分析逻辑。这使得 Elasticsearch 能够针对不同语言、业务场景或特殊需求,…...

《C++初阶之入门基础》【C++的前世今生】

【C的前世今生】目录 前言&#xff1a;---------------起源---------------一、历史背景二、横空出世---------------发展---------------三、标准立世C98&#xff1a;首个国际标准版本C03&#xff1a;小修订版本 四、现代进化C11&#xff1a;现代C的开端C14&#xff1a;对C11的…...

Apache APISIX

目录 Apache APISIX是什么&#xff1f; Lua Lua 的主要特点&#xff1a; Lua 的常见应用&#xff1a; CVE-2020-13945(Apache APISIX默认API Token导致远程Lua代码执行) ​编辑Lua脚本解析 CVE-2021-45232(Apache APISIX Dashboard API权限绕过导致RCE) Apache …...

如何在 git dev 中创建合并请求

先将 自己的代码 推到 自己的远程的 分支上 在 创建 合并请求 根据提示 将 自己的远程的 源码 合并到 对应的分支上 然后 创建 合并请求 等待 对应的 人 来 进行合并就行...

基于nlohmann/json 实现 从C++对象转换成JSON数据格式

C对象的JSON序列化与反序列化 基于JsonCpp库实现C对象序列化与反序列化 JSON 介绍 JSON作为一种轻量级的数据交换格式&#xff0c;在Web服务和应用程序中广泛使用。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读…...

Java枚举类映射MySQL的深度解析与实践指南

Java枚举类映射MySQL的深度解析与实践指南 一、枚举类型映射的四大核心策略 1. 序数映射法&#xff08;ordinal映射&#xff09; ​​实现原理​​&#xff1a;存储枚举值的下标顺序 public enum OrderStatus {PENDING, // 存储为0PROCESSING, // 存储为1SHIPPED, //…...

代码训练LeetCode(21)跳跃游戏2

代码训练(21)LeetCode之跳跃游戏2 Author: Once Day Date: 2025年6月4日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09;力扣 (LeetCode) 全球极客挚爱…...

【HarmonyOS 5】鸿蒙APP使用【团结引擎Unity】开发的案例教程

以下是基于团结引擎开发鸿蒙Unity应用的详细案例教程&#xff0c;整合环境配置、工程适配、跨语言通信等核心环节 一、环境配置&#xff08;关键前置步骤&#xff09; 1. ‌工具安装‌ ‌工具‌‌版本要求‌‌作用‌团结引擎Hub≥1.2.3Unity鸿蒙项目构建管理DevEco Studio≥…...

《T/CI 404-2024 医疗大数据智能采集及管理技术规范》全面解读与实施分析

规范背景与详细信息 《T/CI 404-2024 医疗大数据智能采集及管理技术规范》是由中国国际科技促进会联合河南科技大学、河南科技大学第一附属医院、深圳市人民医院等十余家医疗机构与企业共同制定的团体标准,于2024年5月正式发布实施。该规范是我国医疗大数据领域的重要技术标准…...

国产三维CAD皇冠CAD在「金属压力容器制造」建模教程:蒸汽锅炉

面对蒸汽锅炉设计中复杂的曲面封头、密集的管板开孔、多变的支撑结构以及严格的强度与安全规范&#xff08;如GB150、ASME等&#xff09;&#xff0c;传统二维设计手段往往捉襟见肘&#xff0c;易出错、效率低、协同难。国产三维CAD皇冠CAD&#xff08;CrownCAD&#xff09;凭借…...

Mysql避免索引失效

1. 在索引列上使用函数或表达式 问题描述 SELECT * FROM users WHERE YEAR(create_time) 2023; 如果create_time列上有索引&#xff0c;上述查询会导致索引失效&#xff0c;因为MySQL无法直接利用索引的B树结构。 解决方法 将函数应用于条件值&#xff0c;而不是列&#…...

python爬虫:Ruia的详细使用(一个基于asyncio和aiohttp的异步爬虫框架)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Ruia概述1.1 Ruia介绍1.2 Ruia特点1.3 安装Ruia1.4 使用案例二、基本使用2.1 Request 请求2.2 Response - 响应2.3 Item - 数据提取2.4 Field 提取数据2.5 Spider - 爬虫类2.6 Middleware - 中间件三、高级功能3.1 …...

C++中单例模式详解

在C中&#xff0c;单例模式 (Singleton Pattern) 确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。这在需要一个全局对象来协调整个系统行为的场景中非常有用。 为什么要有单例模式&#xff1f; 在许多项目中&#xff0c;某些类从逻辑上讲只需要一个实…...

舆情监控系统爬虫技术解析

之前我已经详细解释过爬虫在系统中的角色和技术要点&#xff0c;这次需要更聚焦“如何实现”这个动作。 我注意到上次回复偏重架构设计&#xff0c;这次应该拆解为更具体的操作步骤&#xff1a;从目标定义到数据落地的完整流水线。尤其要强调动态调度这个容易被忽视的环节——…...

Windows上用FFmpeg采集摄像头推流 → MediaMTX服务器转发流 → WSL2上拉流播放

1. Windows上 FFmpeg 推流&#xff08;摄像头采集&#xff09; 设备名称可用 ffmpeg -list_devices true -f dshow -i dummy 查询&#xff0c;假设为Integrated Camera 采集推流示例&#xff08;推RTMP到MediaMTX&#xff09;&#xff1a; ffmpeg -rtbufsize 100M -f dshow …...

cpp多线程学习

1.thread std::thread是 C11 引入的跨平台线程管理类&#xff0c;封装了操作系统的线程 API&#xff08;如 pthread、Windows 线程&#xff09;&#xff0c;提供统一的线程操作接口。线程的生命周期由join()和detach()控制。 thread在创建时就开始执行 join()&#xff1a;阻…...

Vue3中Ant-design-vue的使用-附完整代码

前言 首先介绍一下什么是Ant-design-vue Ant Design Vue 是基于 Vue 3 的企业级 UI 组件库&#xff08;同时兼容 Vue 2&#xff09;&#xff0c;是蚂蚁金服开源项目 Ant Design 的 Vue 实现版本。它遵循 Ant Design 的设计规范&#xff0c;提供丰富的组件和高质量的设计体系&…...

k8s热更新-subPath 不支持热更新

文章目录 k8s热更新-subPath 不支持热更新背景subPath 不支持热更新1. 为什么 subPath 不支持热更新&#xff1f;2. 挂载整个目录为何支持热更新&#xff1f;使用demo举例&#xff1a;挂载整个目录&#xff08;不使用 subPath&#xff09; k8s热更新-subPath 不支持热更新 背景…...

Redis Sorted Set 深度解析:从原理到实战应用

Redis Sorted Set 深度解析&#xff1a;从原理到实战应用 在 Redis 丰富的数据结构家族中&#xff0c;Sorted Set&#xff08;有序集合&#xff09;凭借独特的设计和强大的功能&#xff0c;成为处理有序数据场景的得力工具。无论是构建实时排行榜&#xff0c;还是实现基于时间的…...

docker中组合这几个命令来排查 import 模块失败 的问题

pwd ls echo $PYTHONPATH这三个命令是你在 Linux 或 Docker 容器中常用来「查看环境状态」的基础命令。 ✅ 1. echo $PYTHONPATH &#x1f50d; 含义 这是在查看当前的 Python 模块搜索路径。 &#x1f9e0; 分解解释&#xff1a; echo&#xff1a;打印某个变量的值&#x…...

若依框架修改模板,添加通过excel导入数据功能

版本&#xff1a;我后端使用的是RuoYi-Vue-fast版本&#xff0c;前端是RuoYi-Vue3 需求: 我需要每个侧边栏功能都需要具有导入excel功能&#xff0c;但是若依只有用户才具备&#xff0c;我需要代码生成的每个功能都拥有导入功能。​ 每次生成一个一个改实在是太麻烦了。索性…...

web全栈开发学习-01html基础

背景 最近在付费网站学习web全栈开发&#xff0c;记录一下阶段性学习。今天刚好学完html基础&#xff0c;跟着教程画了个基础的网站。 样品展示: 开发工具 vscode Visual Studio Code - Code Editing. Redefined 常用插件 Prettier&#xff1a;格式优化 Live Sever:实时调…...

基于Socketserver+ThreadPoolExecutor+Thread构造的TCP网络实时通信程序

目录 介绍&#xff1a; 源代码&#xff1a; Socketserver-服务端代码 Socketserver客户端代码&#xff1a; 介绍&#xff1a; socketserver是一种传统的传输层网络编程接口&#xff0c;相比WebSocket这种应用层的协议来说&#xff0c;socketserver比较底层&#xff0c;soc…...

[Java 基础]枚举

枚举是一种特殊的类&#xff0c;表示一组固定的常量。枚举跟普通类一样可以用自己的变量、方法和构造函数&#xff0c;构造函数只能使用 private 访问修饰符&#xff0c;所以外部无法调用。 现实生活中的例子&#xff1a; 一周七天&#xff08;MONDAY ~ SUNDAY&#xff09; …...