二、数据结构

链表

单链表

https://www.acwing.com/problem/content/828/

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
//head:头节点的指向   e[i]:当前节点i的值  ne[i]:当前节点i的next指针   idx:当前存储的点
int head, e[N], ne[N], idx;//初始化
void init(){head = -1;idx = 1;
}//将x插入到头节点
void add_head(int x){e[idx] = x;ne[idx] = head;head = idx;idx++;
}//将x插入到下标是k的后面
void add(int k, int x){e[idx] = x;ne[idx] = ne[k];ne[k] = idx;idx++;
}//删除第k+1个节点
void remove(int k){ne[k] = ne[ne[k]];
}int main(){init();int m;cin>>m;char c;while(m--){cin>>c;int k, x;if(c == 'H'){cin>>x;add_head(x);}else if(c == 'D'){cin>>k;//删除头节点if(k == 0){head = ne[head];}else{remove(k);}}else{cin>>k>>x;add(k, x);}}for(int i = head; i != -1; i = ne[i]){cout<<e[i]<<" ";}return 0;
}

双链表

https://www.acwing.com/problem/content/829/

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int e[N], l[N], r[N], idx;//初始化,0表示左端点,1表示右端点,下标从2开始
void init(){r[0] = 1;l[1] = 0;idx = 2;
}//在第k个点的右边插入x
void add(int k, int x){e[idx] = x;r[idx] = r[k];l[idx] = k;l[r[k]] = idx;r[k] = idx;idx++;
}//删除第k个点
void remove(int k){r[l[k]] = r[k];l[r[k]] = l[k];
}int main(){init();int m;cin>>m;string s;while(m--){cin>>s;int k, x;if(s == "L"){cin>>x;add(0, x);}else if(s == "R"){cin>>x;add(l[1], x);}else if(s == "D"){cin>>k;//下标从2开始remove(k + 1);}else if(s == "IL"){cin>>k>>x;add(l[k + 1], x);}else{cin>>k>>x;add(k + 1, x);}}for(int i = r[0]; i != 1; i = r[i]){cout<<e[i]<<" ";}return 0;
}

先进后出

模拟栈

https://www.acwing.com/problem/content/830/

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int st[N], tt;//栈顶插入一个元素
void push(int x){st[++tt] = x;
}//删除栈顶
void pop(){tt--;
}//判断栈是否为空
void empty(){cout<<(tt > 0 ? "NO" : "YES")<<endl;
}//查询栈顶元素
void query(){cout<<st[tt]<<endl;
}int main(){int m;cin>>m;string s;while(m--){int x;cin>>s;if(s == "push"){cin>>x;push(x);}else if(s == "pop"){pop();}else if(s == "empty"){empty();}else{query();}}return 0;
}

表达式求值

https://www.acwing.com/problem/content/3305/

中缀表达式,需要括号;后缀表达式,不需要括号

#include<iostream>
#include<unordered_map>
using namespace std;
const int N = 1e5 + 10;
int st1[N], tt1, tt2; //存储数字
char st2[N]; //存储运算符
unordered_map<char, int> mp{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}}; //运算符优先级
string s;void f(){int x1 = st1[tt1];tt1--;int x2 = st1[tt1];tt1--;char c = st2[tt2];tt2--;int res = 0;if(c == '-'){res = x2 - x1;}else if(c == '+'){res = x2 + x1;}else if(c == '*'){res = x2 * x1;}else{res = x2 / x1;}st1[++tt1] = res;
}int main(){cin>>s;int n = s.size();for(int i = 0; i < n; i++){//如果是数字if(isdigit(s[i])){int x = 0, j = i;//计算数字while(j < n && isdigit(s[j])){x = x * 10 + (s[j] - '0');j++;}//存储到数字栈中st1[++tt1] = x;//因为for循环i还要++i = j - 1;}else if(s[i] == '('){//存储到运算符栈中st2[++tt2] = s[i];}else if(s[i] == ')'){//当栈顶不等于左括号时,就计算括号里的while(st2[tt2] != '('){f();}//弹出左括号tt2--;}else{//当运算符栈中有元素,当前元素小于等于栈顶优先级,则先计算之前的while(tt2 > 0 && mp[st2[tt2]] >= mp[s[i]]){f();}//存储到运算符栈中st2[++tt2] = s[i];}}//防止算了括号里的就结束了while(tt2 > 0){f();}cout<<st1[tt1];return 0;
}

队列

先进先出

模拟队列

https://www.acwing.com/problem/content/831/

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int q[N], hh, tt = -1;//插入元素x
void push(int x){q[++tt] = x;
}//弹出队头
void pop(){hh++;
}//判断队列是否为空
void empty(){cout<<(hh <= tt ? "NO" : "YES")<<endl;
}//查询队头
void query(){cout<<q[hh]<<endl;
}int main(){int m;cin>>m;string s;while(m--){cin>>s;int x;if(s == "push"){cin>>x;push(x);}else if(s == "pop"){pop();}else if(s == "empty"){empty();}else{query();}}return 0;
}

单调栈

https://www.acwing.com/problem/content/832/

存储一个单调递增的序列

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int st[N], tt;
int n, x;int main(){cin>>n;for(int i = 0; i < n; i++){cin>>x;//如果栈顶大于等于当前元素,那就弹出栈顶while(tt && st[tt] >= x){tt--;}//如果栈顶小于当前元素,那就输出if(tt){cout<<st[tt]<<" ";}else{cout<<-1<<" ";}//入栈st[++tt] = x;}return 0;
}

单调队列

https://www.acwing.com/problem/content/156/

#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int a[N], q[N]; //q数组存储下标
int n, k, x;int main(){cin>>n>>k;for(int i = 0; i < n; i++){cin>>a[i];}int hh = 0, tt = -1;for(int i = 0; i < n; i++){cin>>x;//如果队头已经出窗口了,那就出队if(hh <= tt && i - k + 1 > q[hh]){hh++;}//如果队尾大于等于当前元素,那就出队while(hh <= tt && a[q[tt]] >= a[i]){tt--;}//存储下标,要放在输出前,防止第三个元素还没进队列q[++tt] = i; if(i >= k - 1){cout<<a[q[hh]]<<" ";}}cout<<endl;hh = 0, tt = -1;for(int i = 0; i < n; i++){cin>>x;//如果队头已经出窗口了,那就出队if(hh <= tt && i - k + 1 > q[hh]){hh++;}//如果队尾小于等于当前元素,那就出队while(hh <= tt && a[q[tt]] <= a[i]){tt--;}//存储下标,要放在输出前,防止第三个元素还没进队列q[++tt] = i; if(i >= k - 1){cout<<a[q[hh]]<<" ";}}return 0;
}

KMP

https://www.acwing.com/problem/content/833/

在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int ne[N];
int n, m;
char s[N], p[N];int main(){//下标从1开始cin >> m >> p + 1 >> n >> s + 1;//求ne数组for(int i = 2, j = 0; i <= n; i++){while(j && p[i] != p[j + 1]){j = ne[j];}if(p[i] == p[j + 1]){j++;}ne[i] = j;}//s串和p串匹配for(int i = 1, j = 0; i <= n; i++){//如果j没有回到起点,且不相等,那就到标记的位置while(j && s[i] != p[j + 1]){j = ne[j];}//如果匹配,j向后移if(s[i] == p[j + 1]){j++;}//如果完全匹配p串,那就到下一个位置再尝试if(j == m){cout << i - m << " ";j = ne[j];}}return 0;
}//下标从0开始
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int N = 1000010;int n, m;
char s[N], p[N];
int ne[N];int main()
{cin >> m >> p >> n >> s;ne[0] = -1;for (int i = 1, j = -1; i < m; i ++ ){while (j >= 0 && p[j + 1] != p[i]) j = ne[j];if (p[j + 1] == p[i]) j ++ ;ne[i] = j;}for (int i = 0, j = -1; i < n; i ++ ){while (j != -1 && s[i] != p[j + 1]) j = ne[j];if (s[i] == p[j + 1]) j ++ ;if (j == m - 1){cout << i - j << ' ';j = ne[j];}}return 0;
}

Trie树

高效的存储和查找字符串集合

Trie字符串统计

https://www.acwing.com/problem/content/837/

在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int son[N][26], cnt[N], idx; //0是根节点也是空节点
int n;//插入字符串
void insert(char str[N]){int p = 0;//字符串结尾是'\0'for(int i = 0; str[i]; i++){//字母对应成数字int u = str[i] - 'a';if(!son[p][u]){son[p][u] = ++idx;}p = son[p][u];}//标记以这个节点结束的字符串有多少个cnt[p]++;
}//查询字符串
int query(char str[]){int p = 0;for(int i = 0; str[i]; i++){int u = str[i] - 'a';if(!son[p][u]){return 0;}p = son[p][u];}return cnt[p];
}int main(){cin>>n;char c, s[N];while(n--){cin>>c;if(c == 'I'){cin>>s;insert(s);}else{cin>>s;cout<<query(s)<<endl;}}return 0;
}

最大异或对

https://www.acwing.com/problem/content/145/

字典树不单单可以高效存储和查找字符串集合, 还可以存储二进制数字
将每个数以二进制方式存入字典树, 找的时候从最高位去找有无该位的异

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int son[31 * N][2], idx;
int n, x;
int ans, res;void insert(int x){int p = 0;for(int i = 30; i >= 0; i--){int u = x >> i & 1; if(!son[p][u]){son[p][u] = ++idx;}p = son[p][u];}
}int query(int x){int p = 0;int sum = 0;for(int i = 30; i >= 0; i--){int u = x >> i & 1; if(son[p][!u]){p = son[p][!u];sum = 2 * sum + !u;}else{p = son[p][u];sum = 2 * sum + u;}}return sum;
}int main(){cin>>n;for(int i = 0; i < n; i++){cin>>x;insert(x);res = query(x);ans = max(ans, res ^ x);}cout<<ans;return 0;
}

并查集

合并集合

https://www.acwing.com/problem/content/838/

开始时每个集合都是一个独立的集合,并且都是等于自己本身下标的数
例如:p[5]=5,p[3]=3;
如果是M操作的话那么就将集合进行合并,合并的操作是:
p[3]=p[5]=5;
所以3的祖宗节点便成为了5
此时以5为祖宗节点的集合为{5,3}
如果要将p[9]=9插入到p[3]当中,应该找到3的祖宗节点,
然后再把p[9]=9插入其中,所以p[9]=find(3);(find()函数用于查找祖宗节点)
也可以是p[find(9)]=find(3),因为9的节点本身就是9
此时以5为祖宗节点的集合为{5,3,9};

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int p[N];
int n, m;//找到根节点,路径压缩
int find(int x){if(x != p[x]){p[x] = find(p[x]);}return p[x];
}int main(){cin>>n>>m;//初始化每个节点的根节点for(int i = 1; i <= n; i++){p[i] = i;}char c;int a, b;while(m--){cin>>c;if(c == 'M'){cin>>a>>b;//将a合并到b的集合中p[find(a)] = find(b);}else{cin>>a>>b;cout<<(find(a) == find(b) ? "Yes" : "No")<<endl;}}return 0;
}

连通块中点的数量

https://www.acwing.com/problem/content/839/

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int p[N], cnt[N];
int n, m;int find(int x){if(x != p[x]){p[x] = find(p[x]);}return p[x];
}int main(){cin>>n>>m;for(int i = 0; i < n; i++){p[i] = i;cnt[i] = 1;}string s;while(m--){cin>>s;int a, b;if(s == "C"){cin>>a>>b;//如果是一个集合,就不用再加了if(find(a) == find(b)){continue;}cnt[find(b)] += cnt[find(a)];p[find(a)] = find(b);}else if(s == "Q1"){cin>>a>>b;cout<<(find(a) == find(b) ? "Yes" : "No")<<endl;}else{cin>>a;cout<<cnt[find(a)]<<endl;}}return 0;
}

食物链

https://www.acwing.com/problem/content/description/242/

#include<iostream>
using namespace std;
const int N = 5e4 + 10;
int p[N], d[N]; //p存储根节点,d存储到根节点的距离
int n, k;
int res;int find(int x){if(x != p[x]){int t = find(p[x]);d[x] += d[p[x]];p[x] = t;}return p[x];
}int main(){cin>>n>>k;for(int i = 1; i <= n; i++){p[i] = i;}int c, x, y;while(k--){cin>>c>>x>>y;if(x > n || y > n){res++;}else{//找到x和y的根节点int px = find(x), py = find(y);if(c == 1){//如果父节点相同,但是距离不同,就是假话if(px == py && (d[x] - d[y]) % 3){res++;}else if(px != py){//不在一个集合,放在一个集合中p[px] = py;d[px] = d[y] - d[x]; //d[px] + d[x]和d[y]同余}}else{if(px == py && (d[x] - d[y] - 1) % 3){res++;}else if(px != py){p[px] = py;d[px] = d[y] - d[x] + 1;}}}}cout<<res;return 0;
}

用一个一维数组存储一颗二叉树
1.插入一个元素
2.求集合当中最小值(最大值)
3.删除最小值(最大值)
4.删除任意一个元素
5.修改任意一个元素

小根堆:根节点小于等于左右子节点

堆排序

https://www.acwing.com/problem/content/840/
在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int h[N], cnt;
int n, m;void down(int u){int t = u;//如果根节点大于左右子节点,那就交换下标if(2 * u <= cnt && h[2 * u] < h[t]){t = 2 * u;}if(2 * u + 1 <= cnt && h[2 * u + 1] < h[t]){t = 2 * u + 1;}//如果已经交换了下标,那就递归子节点,u为根节点,t为子节点if(h[t] != h[u]){swap(h[t], h[u]);down(t);}
}int main(){cin>>n>>m;cnt = n;for(int i = 1; i <= n; i++){cin>>h[i];}for(int i = n / 2; i > 0; i--){down(i);}while(m--){cout<<h[1]<<" ";h[1] = h[cnt];cnt--;down(1);}return 0;
}

模拟堆

https://www.acwing.com/problem/content/841/

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int h[N], cnt, m; //m:第几个插入的数
int hp[N], ph[N]; //hp[k]:第k个插入的点是几号,ph[j]:j号是第几个插入的点
int n;void head_swap(int a, int b){swap(hp[ph[a]], hp[ph[b]]);swap(ph[a], ph[b]);swap(h[a], h[b]);
}void down(int u){int t = u;if(2 * u <= cnt && h[2 * u] < h[t]){t = 2 * u;}if(2 * u + 1 <= cnt && h[2 * u + 1] < h[t]){t = 2 * u + 1;}if(h[t] != h[u]){head_swap(t, u);down(t);}
}void up(int u){while(u / 2 > 0 && h[u / 2] > h[u]){head_swap(u / 2, u);u /= 2;}
}int main(){cin>>n;string s;while(n--){cin>>s;int k, x;if(s == "I"){cin>>x;m++;cnt++;hp[m] = cnt;ph[cnt] = m;h[cnt] = x;up(cnt);}else if(s == "PM"){cout<<h[1]<<endl;}else if(s == "DM"){head_swap(1, cnt);cnt--;down(1);}else if(s == "D"){cin>>k;k = hp[k];head_swap(k, cnt);cnt--;down(k);up(k);}else{cin>>k>>x;k = hp[k];h[k] = x;down(k);up(k);}}return 0;
}

哈希表

模拟散列表

https://www.acwing.com/problem/content/842/

//拉链法
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5 + 3; //大于1e5的第一个质数
int h[N], e[N], ne[N], idx;
int n;void insert(int x){//加N防止模出来的数是负数int k = (x % N + N) % N; e[idx] = x;ne[idx] = h[k];h[k] = idx;idx++;
}int find(int x){int k = (x % N + N) % N;for(int i = h[k]; i != -1; i = ne[i]){if(e[i] == x){return 1;}}return 0;
}int main(){cin>>n;memset(h, -1, sizeof(h));char c;while(n--){cin>>c;int x;if(c == 'I'){cin>>x;insert(x);}else{cin>>x;if(find(x)){cout<<"Yes"<<endl;}else{cout<<"No"<<endl;}}}return 0;
}//开放寻地址法
#include<iostream>
#include<cstring>
using namespace std;
const int N = 2e5 + 3, null = 0x3f3f3f3f; //第一个大于2e5的质数
int h[N];
int n;int find(int x){int k = (x % N + N) % N;//如果k位置不等于x,那就找下一个数while(h[k] != x && h[k] != null){k++;//到结尾也没找到,就从头开始找if(k == N){k = 0;}}return k;
}int main(){memset(h, 0x3f, sizeof(h));cin>>n;char c;while(n--){cin>>c;int x;if(c == 'I'){cin>>x;//找到第一个空位置int k = find(x);h[k] = x;}else{cin>>x;//查询是否有x存在int k = find(x);cout<<(h[k] == x ? "Yes" : "No")<<endl;}}return 0;
}

字符串哈希

https://www.acwing.com/problem/content/843/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<iostream>
using namespace std;
const int N = 1e5 + 10, p = 131; //p为131或13331,2的64次方,溢出int就等效于取模了
unsigned long long a[N], b[N]; //a存储前缀和,b存储要乘的进位数
char s[N];
int n, m;//初始化
void init(){b[0] = 1;for(int i = 1; i <= n; i++){a[i] = a[i - 1] * p + s[i];b[i] = b[i - 1] * p;}
}unsigned long long get(int l, int r){return a[r] - a[l - 1] * b[r - l + 1];
}int main(){cin>>n>>m>>s + 1;init();int l1, r1, l2, r2;while(m--){cin>>l1>>r1>>l2>>r2;cout<<(get(l1, r1) == get(l2, r2) ? "Yes" : "No")<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/255297.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01动力云客之环境准备+前端Vite搭建VUE项目入门+引入Element PLUS

1. 技术选型 前端&#xff1a;Html、CSS、JavaScript、Vue、Axios、Element Plus 后端&#xff1a;Spring Boot、Spring Security、MyBatis、MySQL、Redis 相关组件&#xff1a;HiKariCP&#xff08;Spring Boot默认数据库连接池&#xff09;、Spring-Data-Redis&#xff08;S…

【多模态大模型】视觉大模型SAM:如何使模型能够处理任意图像的分割任务?

SAM&#xff1a;如何使模型能够处理任意图像的分割任务&#xff1f; 核心思想起始问题: 如何使模型能够处理任意图像的分割任务&#xff1f;5why分析5so分析 总结子问题1: 如何编码输入图像以适应分割任务&#xff1f;子问题2: 如何处理各种形式的分割提示&#xff1f;子问题3:…

43.1k star, 免费开源的 markdown 编辑器

简介 项目名&#xff1a; MarkText-- 简单而优雅的开源 Markdown 编辑器 Github 开源地址&#xff1a; https://github.com/marktext/marktext 官网&#xff1a; https://www.marktext.cc/ 支持平台&#xff1a; Linux, macOS 以及 Windows。 操作界面&#xff1a; 在操作界…

vueRouter中Hash模式和History模式有什么区别

VueRouter是Vue.js官方推荐的前端路由库&#xff0c;它提供了一种方便的方式来构建单页应用&#xff08;SPA&#xff09;。在使用VueRouter时&#xff0c;我们可以选择不同的路由模式&#xff0c;其中最常见的是Hash模式和History模式。本文将深入探讨这两种模式的区别&#xf…

资产管理系统技术架构设计与实现

资产管理系统在现代金融领域扮演着至关重要的角色。它不仅帮助机构有效管理和优化资产配置&#xff0c;还提供了风险控制、绩效评估等功能。本文将探讨资产管理系统的技术架构设计与实现&#xff0c;以帮助读者深入了解该系统&#xff0c;并为其开发和部署提供参考。 1. 概述资…

【算法与数据结构】496、503、LeetCode下一个更大元素I II

文章目录 一、496、下一个更大元素 I二、503、下一个更大元素II三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、496、下一个更大元素 I 思路分析&#xff1a;本题思路和【算法与数据结构】739、LeetCode每日温度类似…

spring boot和spring cloud项目中配置文件application和bootstrap中的值与对应的配置类绑定处理

在前面的文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136065211 加载完文件转换为 Environment 中对应的值之后&#xff0c;接下来需要将对应的值与对应的配置类进行绑定&#xff0c;方便对应的组件取值处理接下来的操作。 对应的配置值与配置类绑定通过 Con…

排序算法---堆排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 堆排序&#xff08;Heap Sort&#xff09;是一种基于二叉堆数据结构的排序算法。它将待排序的元素构建成一个最大堆&#xff08;或最小堆&#xff09;&#xff0c;然后逐步将堆顶元素与堆的最后一个元素交换位置&#xff0c…

AI助力农作物自动采摘,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建作番茄采摘场景下番茄成熟度检测识别计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物&#xff0c;专家设计出来了很多用于采摘不同农作物的大型机械&#xff0c;看着非常震撼&#xff0c;但是我们国内农业的发展还是相对比较滞后的&#xff0…

Mysql-数据库优化-客户端连接参数

客户端参数 原文地址 # 连接池配置 # 初始化连接数 spring.datasource.druid.initial-size1 # 最小空闲连接数&#xff0c;一般设置和initial-size一致 spring.datasource.druid.min-idle1 # 最大活动连接数&#xff0c;一个数据库能够支撑最大的连接数是多少呢&#xff1f; …

PKI - 借助Nginx 实现Https_使用CA签发证书

文章目录 Pre概述操作步骤1. 生成 CA 密钥对2. 生成自签名的 CA 证书3. 生成服务器密钥对和证书签名请求 (CSR)4. 使用 CA 签署服务器证书 Nginx Https 自签证书1. 生成自签名证书和私钥2. 配置 Nginx 使用 CA签发的 HTTPS 证书3. 重启 Nginx 服务4. 直接访问5. 不验证证书直接…

【书生·浦语大模型实战营】学习笔记1

大模型成为发展通用人工智能的重要途经 专用模型&#xff1a;针对特定任务&#xff0c;一个模型解决一个问题 通用大模型&#xff1a;一个模型应对多种任务、多种模态 书生浦语大模型系列 上海人工智能实验室 轻量级、中量级、重量级 7B 和 123B的轻量级和中量级大模型都是开源…

【数据结构】二叉树的顺序结构及实现(堆)

目录 1.二叉树的顺序结构 2.堆的概念及结构 3.堆的实现 3.1堆向下调整算法 3.2堆的创建 3.3建堆的时间复杂度 3.4堆的插入 3.5堆的删除 3.6堆的代码实现 3.7堆的应用 3.71堆排序 3.72 TOP-K问题 1.二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因…

游戏服务器多少钱一台?腾讯云32元,阿里云26元

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选&#xff0c;可以选择轻量应用服务器和云服务器&#xff0c;阿腾云atengyu…

Open CASCADE学习|保存为STL文件

STL (Stereolithography) 文件是一种广泛用于3D打印和计算机辅助设计 (CAD) 领域的文件格式。它描述了一个三维模型的表面而不包含颜色、材质或其他非几何信息。STL文件通常用于3D打印过程中&#xff0c;因为它们仅包含构建物体所需的位置信息。 由于STL文件只包含表面信息&am…

MacOS 查AirPods 电量技巧:可实现低电量提醒、自动弹窗

要怎么透过macOS 来查询AirPods 电量呢&#xff1f;当AirPods 和Mac 配对后&#xff0c;有的朋友想通过Mac来查询AirPods有多少电量&#xff0c;这个里有几个技巧&#xff0c;下面我们来介绍一下。 透过Mac 查AirPods 电量技巧 技巧1. 利用状态列上音量功能查询 如要使用此功能…

C++自定义函数详解

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 铁汁们新年好呀&#xff0c;今天我们来了解自定义函数。 文章目录 1.数学中的函数 2.什么是自定义函数 3.自定义函数如何使用&#xff1f; 4.值传递和引用传递&#xff08;形参和实参区分&#xff09; …

Acwing---837. 连通块中点的数量

连通块中点的数量 1.题目2.基本思想3.代码实现 1.题目 给定一个包含 n n n个点&#xff08;编号为 1 ∼ n 1∼n 1∼n&#xff09;的无向图&#xff0c;初始时图中没有边。 现在要进行 m m m 个操作&#xff0c;操作共有三种&#xff1a; C a b&#xff0c;在点 a 和点 b …

计算机网络基本知识(二)

文章目录 概要分层为什么分层怎么分层&#xff1f;1.实体2.协议3.服务 分层基本原则正式认识分层详细例子解释 总结 概要 分层知识&#xff1a;概念理解 分层 为什么分层 大致以上五点 为了解决上面的问题&#xff08;复杂&#xff09; 大问题划分为小问题 怎么分层&#…

【后端高频面试题--Mybatis篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 后端高频面试题--Mybatis篇 什么是Mybatis&#xff1f;Mybatis的优缺点&#xff1f;Mybatis的特点…