离散化的两种实现方式【sort或者map】

离散化

定义

把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。
适用范围:数组中元素值域很大,但个数不是很多。
比如将a[]=[1,3,100,2000,500000]映射到[0,1,2,3,4]这个过程就叫离散化。

两种离散化方式

1.利用sort+unique进行数据离散化(适用于区间查找,及更新)

常与前缀和、树状数组、线段树和动态规范结合考查。

先来看一个金典题目:
题目
假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。
现在,我们首先进行 n次操作,每次操作将某一位置 x 上的数加 c。
接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [ l , r ] 之间的所有数的和。

输入格式:
第一行包含两个整数 n 和 m。
接下来 n行,每行包含两个整数 x 和 c。
再接下来 m 行,每行包含两个整数 l 和 r。

输出格式:
共 m 行,每行输出一个询问中所求的区间内数字和。

数据范围:
−109 ≤ x ≤ 109

1 ≤ n ≤ 105

1 ≤ m ≤ 105

−109 ≤ l ≤ r ≤ 109

− 10000 ≤ c ≤ 10000
输入样例
3 3
1 2
3 6
7 5
1 3
4 6
7 8
输出样例
8
0
5
思路:
由于1 ≤ n ≤ 105 和1 ≤ m ≤ 105 所调用的数字范围较小,而数轴范围较大,故可以将通过离散化处理,将−109 ≤ x ≤ 109
范围缩为 −105 ≤ x ≤ 105 左右,大大提高效率。
在这里插入图片描述
代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int, int> PII;
const int N = 3 * 1e5 + 10;
int a[N], s[N];
vector<int> alls;
vector<PII> add, query;// 二分查找
int find(int x)
{int l = 0, r = alls.size() - 1;while (l < r){int mid = l + ((r - l) >> 1);if (alls[mid] >= x) r = mid;else l = mid + 1;}return l + 1; // 由于S是从1开始的,所以对应映射位置都往前提一位
}
int main()
{int n, m;cin >> n >> m;for (int i = 0; i < n; ++i){int x, c;cin >> x >> c;add.push_back({x, c});alls.push_back(x);}for (int i = 0; i < m; ++i){int l, r;cin >> l >> r;query.push_back({l, r});alls.push_back(l);alls.push_back(r);}sort(alls.begin(), alls.end());alls.erase(unique(alls.begin(), alls.end()), alls.end());for (auto& item : add){int x = find(item.first);a[x] += item.second;}for (int i = 1; i <= alls.size(); ++i) s[i] = s[i - 1] + a[i];for (auto& item : query){int l = find(item.first), r = find(item.second);cout << s[r] - s[l - 1] << endl;}return 0;
}

当然这里也可以用数组+lower_bound来做,下面会说

1.1 Mayor’s posters POJ - 2528

在这里插入图片描述
思路:
可以将问题转化为,求区间的最小值,让每个区间的海报标记为第i个放的,然后用线段树来做。
查询每个海报区间的最小值是否等于i,如果等于i则没有被完全覆盖。本题的数据量太大,区间是[1, 1e7],
所以要用离散化,存取l和r的相对大小,因为n = 1e4,所以离散过后的区间为[1, 2 * n]。
时间复杂度O(nlogn)

#include<cstdio>
#include<map>
#include<iostream>
#include<algorithm>
#define ls 		rt << 1, l, m
#define rs 		rt << 1 | 1,  m + 1, r
using namespace std;
const int maxn = 2e4 + 5;
int mi[maxn << 2], a[maxn], add[maxn<<2];
struct node{int l, r, pos;
}arr[maxn];
int n;
void pushUp(int rt){mi[rt] = min(mi[rt << 1], mi[rt << 1 | 1]);
}
//下推标记 
void pushDown(int rt){add[rt << 1] = add[rt];add[rt << 1 | 1] = add[rt];mi[rt << 1] = add[rt];mi[rt << 1 | 1] = add[rt];add[rt] = 0;
}
//建树,此过程可用memset代替 
void build(int rt, int l, int r){if (l == r){mi[rt] = 0;return;}int m = (l + r) >> 1;build(ls);build(rs);pushUp(rt);
}
//区间修改 
void update(int rt, int l, int r, int L, int R, int C){if (L <= l && r <= R){mi[rt] = C;add[rt] = C;return;}if(add[rt] != 0)	pushDown(rt);int m = (l + r) >> 1;if (L <= m)		update(ls, L, R, C);if (m < R)		update(rs, L, R, C);pushUp(rt);
}
//查询区间最小值 
int query(int rt, int l, int r, int L, int R){if (L <= l && r <= R){return mi[rt];}if (add[rt] != 0)	pushDown(rt);int m = (l + r) >> 1;int res = maxn;if (L <= m)		res = min(res, query(ls, L, R));if (m < R)		res = min(res, query(rs, L, R));return res;
}
//离散化 
void disc(int cnt){sort(a, a + cnt);int lena = unique(a, a + cnt) - a;for (int i = 0; i < n; ++i){arr[i].l = lower_bound(a, a + lena, arr[i].l) - a + 1;arr[i].r = lower_bound(a, a + lena, arr[i].r) - a + 1;//	printf("l = %d   r = %d\n", arr[i].l, arr[i].r);}
}
void solve(){scanf("%d", &n);build(1, 1, n << 1);int cnt = 0;for (int i = 0; i < n; ++i){scanf("%d%d", &arr[i].l, &arr[i].r);arr[i].pos = i + 1;a[cnt++] = arr[i].l;a[cnt++] = arr[i].r;}disc(cnt);for (int i = 0; i < n; ++i){update(1, 1, n << 1, arr[i].l, arr[i].r, arr[i].pos);} int ans = 0;for (int i = 0; i < n; ++i){int x = query(1, 1, n << 1, arr[i].l, arr[i].r);//printf("x = %d\n", x);if (x == arr[i].pos)	ans++;}printf("%d\n", ans);
}
int main(){int t;scanf("%d", &t);for (int i = 0; i < t; ++i) solve();return 0;
}

1.2 Mayor’s posters POJ - 2528

/*
需要计划你接下来k天的日程。在每一天里.她可以选择学习或者颓废,但是为了劳逸结合,日程表有两类限制:
1、在某个时间段中至少有一天要学习。
2、在某个时间段中至少有一天要颓废。
请问一共有多少种合法的日程表?答案对1000000007取模。
输入格式
第一行三个非负整数k,n,m,分别表示天数,至少有一天学习的时间段个数和至少有一天颓废的时间段个数。
接下来n行,每行两个正整数l,r,表示第l至第r天中至少有一天学习。
接下来m行.每行两个正整数l,r,表示第l至第r天中至少有一天颓废。
输出格式
一行一个整数,表示答案对1000000007取模后的结果。
样例输入 
5 2 2
1 3
3 5
2 2 
4 5
样例输出 
8以下把学习称为填黑,颓废称为填白。先离散化一下,每段有三种情况∶全黑、全白、有黑有白。
最终方案需要满足没有一个连续黑段包含完整的第二类区间,也没有一个连续白段包含完整的第一类区间。
设fi.gi,hi表示从左到右填到第i段,且结尾是黑、白、有黑有白的合法方案数,那么i这个位置往前的最长黑色、白色连续
段长度很容易求出,转移用前缀和优化一下就行了。复杂度瓶颈是离散化。
也有开两个线段树记录最后一个和末尾不同的位置的做法,但是比较难写,常数也较大,可能被卡常。接着,我们使用动态规划来计算填黑和填白的方案数。我们用fs[i]表示以第i个时间段结尾的全填黑的方案数,ft[i]表示以第i个时间段结尾的全填白的方案数,g[i]表示以第i个时间段结尾有黑有白的方案数。对于fs[i],我们可以根据之前的结果得到,如果第i个时间段全填黑,那么前一个时间段只能全填白或者有黑有白,所以有fs[i] = (sg[i-1] - sg[mt[i]-1] + MOD) % MOD + (st[i-1] - st[mt[i]-1] + MOD) % MOD,其中sg[i]和st[i]分别表示前i个时间段填黑和填白的方案数的前缀和,mt[i]表示以第i个时间段结尾的最短黑色时间段的左端点。对于ft[i],同理我们有ft[i] = (sg[i-1] - sg[ms[i]-1] + MOD) % MOD + (ss[i-1] - ss[ms[i]-1] + MOD) % MOD,其中sg[i]和ss[i]分别表示前i个时间段填黑和填白的方案数的前缀和,ms[i]表示以第i个时间段结尾的最短白色时间段的左端点。对于g[i],如果我们在第i个时间段结尾填黑,那么前i-1个时间段可以是全填黑、全填白或者有黑有白,所以有g[i] = ((fs[i-1] + ft[i-1]) % MOD + g[i-1]) * (2^(h[i] - h[i-1]) - 2 + MOD) % MOD,其中2^(h[i] - h[i-1]) - 2表示前i个时间段填黑或填白的所有方案数。
这里2^(h[i] - h[i-1]) - 2表示前i个时间段有黑有白的方案数,一共有h[i]-h[i-1]并且每个时间点可以填黑或填白,所以就是2^(h[i] -h[i-1])。-2是要减去全黑和全白的两种情况。最后答案就是fs[hc] + ft[hc] + g[hc]。*/#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 400005, mod = 1e9 + 7;
/*ls,rs:表示填黑时间段的左端点和右端点lt,rt:表示填白时间段的左端点和右端点hc, h: h表示存填白\黑的时间段左右端点,hc表示一共有多少个时间段 * 2 ,注要多存整个时间段(0, k] fs, ft, g:分别表示全填黑、全填白和有黑有白的方案数。 ss,st,sg:分别是全填黑、全填白和有黑有白的前缀和。ms和mt:ms存的是以R(离散化过后)为右端点的最短黑段的L值,mt同理。
*/
int k, n, m, hc;
int ls[N], rs[N], lt[N], rt[N], h[N], ms[N], mt[N];  
int fs[N], ft[N], g[N], ss[N], st[N], sg[N];
int ksm(int a, int b) { // 快速幂 int x = 1;for (; b > 0; b & 1 ? x = 1ll * x * a % mod : 0, a = 1ll * a * a % mod, b >>= 1);return x;
}
inline int m1(int x) { //求余 return x >= mod ? x - mod : x;
}
inline int input() {int x = 0, F = 1;char c = getchar();while (c > '9' || c < '0') {if (c == '-')F = -1;c = getchar();}while (c <= '9' && c >= '0') {x = x * 10 + c - '0';c = getchar();}return x * F;
}
int main() {k = input();n = input();m = input();for (int i = 1; i <= n; i++)ls[i] = input(), rs[i] = input(), h[++hc] = ls[i] - 1, h[++hc] = rs[i];for (int i = 1; i <= m; i++)lt[i] = input(), rt[i] = input(), h[++hc] = lt[i] - 1, h[++hc] = rt[i];h[++hc] = 0;h[++hc] = k;sort(h + 1, h + hc + 1);hc = unique(h + 1, h + hc + 1) - h - 1; // 排序去重 for (int i = 1; i <= n; i++) { // 填黑 int L = lower_bound(h + 1, h + hc + 1, ls[i] - 1) - h, R = lower_bound(h + 1, h + hc + 1, rs[i]) - h;ms[R] = max(ms[R], L + 1); // L,R是相对大小,以R为右端点,存的是最短的区间}for (int i = 1; i <= m; i++) { // 填白 int L = lower_bound(h + 1, h + hc + 1, lt[i] - 1) - h, R = lower_bound(h + 1, h + hc + 1, rt[i]) - h;mt[R] = max(mt[R], L + 1);}g[1] = sg[1] = 1; // 第一天可填黑可填白ms[1] = mt[1] = 1; // ms和mt保存的是第一个时间段为[1, 1]的值for (int i = 2; i <= hc; i++) {ms[i] = max(ms[i - 1], ms[i]); //黑: 这里找一个以i点为右端点的最大左端点mt[i] = max(mt[i - 1], mt[i]);fs[i] = m1(m1(sg[i - 1] - sg[mt[i] - 1] + mod) + m1(st[i - 1] - st[mt[i] - 1] + mod));// 第i段以i结尾的全填黑 ft[i] = m1(m1(sg[i - 1] - sg[ms[i] - 1] + mod) + m1(ss[i - 1] - ss[ms[i] - 1] + mod));g[i] = 1ll * m1(m1(fs[i - 1] + ft[i - 1]) + g[i - 1]) * (ksm(2, h[i] - h[i - 1]) - 2 + mod) % mod;ss[i] = m1(ss[i - 1] + fs[i]);st[i] = m1(st[i - 1] + ft[i]);sg[i] = m1(sg[i - 1] + g[i]);}printf("%d", m1(m1(fs[hc] + ft[hc]) + g[hc]));return 0;
}

2.利用map或unordered_map进行数据离散化 (使用与非区间操作)

常与差分、并查集、DFS等算法结合考察

2.1 邮票 FZU - 2227【DFS】

题目描述

在这里插入图片描述
思路
可以先做映射关系(离散化),然后从最小的数并且这个数出现的次数为1开始dfs,走到哪直接就存到哪。
代码

#include<cstdio>
#include<vector>
#include<map>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
map<int,int>index,data,num;
vector<int>v[maxn];//邻接表,存相对大小的关系 
int cnt,pos;
int dis[maxn];
bool vis[maxn];
void dfs(int x)
{if(cnt==pos)	return;//int len=v[x].size();for(int i=0;i<2;i++) // 题目保证有解,说明一个顶点最多有两个出度{int y=v[x][i];if(!vis[y]){vis[y]=true;dis[pos++]=data[y];dfs(y);}if(cnt==pos)	return;}
}
int main()
{int n;while(scanf("%d",&n)!=EOF){int ui,vi;cnt=0,pos=0;index.clear();data.clear();num.clear();memset(vis,false,sizeof(vis));for(int i=0;i<2*n;i++)	v[i].clear();while(n--){scanf("%d%d",&ui,&vi);if(!num[ui]) {index[ui]=cnt++;data[index[ui]]=ui;//建立映射关系 (1,100) (100,1) }if(!num[vi]){index[vi]=cnt++;data[index[vi]]=vi;}v[index[ui]].push_back(index[vi]);//建立相对大小的对应关系 v[index[vi]].push_back(index[ui]);num[ui]++;num[vi]++;}int st=0;for(map<int,int>::iterator it=num.begin();it!=num.end();it++){if(it->second==1) //判断是否唯一出现,第一个唯一出现的肯定是字典序最小且起始的位置	{st=index[it->first];break;}}vis[st]=true;dis[pos++]=data[st];dfs(st);for(int i=0;i<cnt;i++){printf("%d",dis[i]);if(i<cnt-1)	printf(" ");else	printf("\n");}}
}

2.2 More is better HDU - 1856 【并查集】

题目描述
在这里插入图片描述
思路:
在集合合并的时,如果两个集合不同,那么在合并成同一个集合的时候,
将被合并的集合里的个数加到这个集合里面,并统计最大值。
坑点:就是当输入n为0时,答案为1,因为当没有朋友对时,各自在自己的房间,所以说答案为1。
代码:

#include<iostream>
#include<cstdio>
#include<map>
#include<utility>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 5;
map<int, int> mp;
int fa[maxn], num[maxn], ans = 0;
void init(int n){for (int i = 1; i <= n; ++i){fa[i] = i;num[i] = 1;}
}
int find(int x){return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}
void _union(int x, int y){x = find(x);y = find(y);if(x != y){num[y] += num[fa[x]];ans = max(ans, num[y]);fa[x] = y;}
}
void solve(){int n, x, y;while (scanf("%d", &n) != EOF){int cnt = 0;ans = 0;init(maxn); mp.clear();if (n == 0){puts("1");continue;}while (n--){scanf("%d%d", &x, &y);if(!mp[x])	mp[x] = ++cnt;if(!mp[y])	mp[y] = ++cnt;_union(mp[x], mp[y]);}printf("%d\n", ans);}
}
int main(){solve();return 0;
}

2.3 金发姑娘和 N 头牛 - 1952. AcWing题库

题目描述
在这里插入图片描述
思路:
在这里插入图片描述
代码

#include <iostream>
#include <cstring>
#include <map>
#include <algorithm>using namespace std;const int INF = 2e9;int n, x, y, z;int main()
{map<int, int> b; // 离散化及差分数组cin >> n >> x >> y >> z;for (int i = 0; i < n; i ++ ){//给三个大区间 + cint l, r;cin >> l >> r;//[-INF,r)b[-INF] += x;b[l] -= x;//[l, r]b[l] += y;b[r + 1] -= y;//b(r, INF]b[r + 1] += z;b[INF] -= z;}int res = 0, sum = 0;// 枚举差分数组,求前缀和,更新最大值for(auto item : b){sum += item.second;// 前缀和res = max(res, sum);}cout << res;return 0;
}

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

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

相关文章

基于IP地址的目的地址转换

基本需求 由于来自INTERNET的对政府、企业的网络攻击日益频繁&#xff0c;因此需要对内网中向外网提供访问服务的关键设备进行有效保护。采用目的地址NAT可以有效地将内部网络地址对外隐藏。 图中&#xff1a;公网Internet用户需要通过防火墙访问WEB服务器&#xff0c;为了隐藏…

macOS下Django环境搭建

1. macOS升级pip /Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip 2. 卸载Python3.9.5版本 $ sudo rm -rf /usr/local/bin/python3 $ sudo rm -rf /usr/local/bin/pip3 $ sudo rm -rf /Library/Frameworks/Python.framework 3. 安装P…

Redis安装以及配置隧道连接(centOs)

目录 1.centOs安装Redis 2. Redis 启动和停⽌ 3. 操作Redis 2.Xshell配置隧道 1.centOs安装Redis #使⽤yum安装Redis yum -y install redis 2. Redis 启动和停⽌ #查看是否启动 ps -ef|grep redis#启动redis: redis-server /etc/redis.conf &#停⽌Redis redis-cli sh…

【代码随想录-LeetCode第一题】二分查找及实现

LeetCode刷题第一题&#xff1a;704二分查找法 什么是二分查找&#xff1f;题目思路和边界问题 参考 代码随想录 什么是二分查找&#xff1f; 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的查找算法。它通过将目标值与数组的中间元素进行比…

Teams Room视频会议室方案

需求背景&#xff1a; 适合在40平米的会议室参加Teams视频会议&#xff0c;会议桌周围可以坐20人&#xff0c;要求&#xff1a; 1&#xff0c;操作简单&#xff0c;一键入会Teams Room&#xff1b; 2&#xff0c;任何人带上自己的笔记本电脑&#xff0c;可以分享电脑画面&#…

【TypeScript】初识TypeScript和变量类型介绍

TypeScript 1&#xff0c;TypeScript是什么?2&#xff0c;类型的缺失带来的影响3&#xff0c;Ts搭建环境-本博主有专门的文章专说明这个4&#xff0c;使用tsc对ts文件进行编译5&#xff0c;TS运行初体验简化Ts运行步骤解决方案1解决方案2&#xff08;常见&#xff09; 开始学习…

小程序wx:else提示 Bad attr `wx

问题&#xff1a;以下wx:for里的wx:if &#xff0c; wx:else 会报这个错&#xff1a;Bad attr wx <scroll-view class"scroll1" scroll-x enable-flex"true"><view wx:if"{{playlist.length>0}}" class"item" wx:for"…

Vue电商项目--订单和支付

提交订单 没有组件&#xff0c;先搬组件 配置路由 然后静态pay页面就有了 这里提交订单不是简单的直接进行路由的跳转&#xff0c;而且要拿你支付的数据向服务器发请求 提交订单 请求地址 /api/order/auth/submitOrder?tradeNo{tradeNo} 请求方式 POST 参数类型 参数名…

Kubernetes架构和工作流程

目录 一、kubernetes简介 1.k8s的由来 2.为什么用 k8s &#xff1f; 3.k8s主要功能 二、k8s集群架构与组件 1.Master 组件 1.1Kube-apiserver 1.2Kube-controller-manager 1.3Kube-scheduler 2.Node组件 2.1Kubelet 2.2Kube-Proxy 2.3docker 或 rocket 3.配置存储中…

刷题笔记 day8

1004 最大连续1的个数 III 这道题要求将原数组中的0翻转成1&#xff0c;求出最大元素全是1的子数组长度&#xff0c;看这道题第一感觉还要将里面的0变成1&#xff0c;感觉这道题解决起来很麻烦&#xff0c;但是我们可以转变思路&#xff0c;找出其最大子数组&#xff0c;使得子…

K8S系列文章 之 容器存储基础 Volume

Volume Volume是容器数据卷。我们经常创建删除一些容器&#xff0c;但有时候需要保留容器中的一些数据&#xff0c;这时候就用到了Volume。它也是容器之间数据共享的技术&#xff0c;可以将容器中产生的数据同步到本地。实际就是把容器中的目录挂载到运行着容器的服务器或个人…

FANUC机器人SRVO-105和SRVO-067故障报警原因分析及处理方法

FANUC机器人SRVO-105和SRVO-067故障报警原因分析及处理方法 如下图所示,公司的一台机器人在正常工作时突然报警SRVO-105门打开或紧急停止,同时还有SRVO-067 OHAL2报警(G:1 A:2),按Reset键无法消除报警, 那么遇到这种情况,首先,我们来看一下报警说明书上的解释: 首先…

LeetCode 热题 100 JavaScript--206. 反转链表

/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val (valundefined ? 0 : val)* this.next (nextundefined ? null : next)* }*/ /*** param {ListNode} head* return {ListNode}*/1、逐个断键&#xff0c;将后一个节点放到前面 …

任务14、无缝衔接,MidJourney瓷砖(Tile)参数制作精良贴图

14.1 任务概述 在这个实验任务中,我们将深入探索《Midjourney Ai绘画》中的Tile技术和其在艺术创作中的具有挑战性的应用。此任务将通过理论学习与实践操作相结合的方式,让参与者更好地理解Tile的核心概念,熟练掌握如何在Midjourney平台上使用Tile参数,并实际运用到AI绘画…

初学者自学python哪本书好,python教程自学全套

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python怎么自学,可以达到什么程度&#xff0c;初学者自学python哪本书好&#xff0c;现在让我们一起来看看吧&#xff01; 前言 Python是一个非常适合自学&#xff0c;0基础的话从入门到精通也只需要花3-4个月PYTHON库“…

边写代码边学习之LSTM

1. 什么是LSTM 长短期记忆网络 LSTM&#xff08;long short-term memory&#xff09;是 RNN 的一种变体&#xff0c;其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径&#xff0c;让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲&a…

Pytorch深度学习-----神经网络之线性层用法

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

MySQL索引3——Explain关键字和索引使用规则(SQL提示、索引失效、最左前缀法则)

目录 Explain关键字 索引性能分析 Id ——select的查询序列号 Select_type——select查询的类型 Table——表名称 Type——select的连接类型 Possible_key ——显示可能应用在这张表的索引 Key——实际用到的索引 Key_len——实际索引使用到的字节数 Ref ——索引命…

【Linux】五、进程

一、冯诺依曼体系结构 存储器&#xff1a;指的是内存&#xff1b; 输入设备&#xff1a;键盘、摄像头、话筒&#xff0c;磁盘&#xff0c;网卡&#xff1b; 输出设备&#xff1a;显示器、音响、磁盘、网卡&#xff1b; 中央处理器&#xff08;CPU&#xff09;&#xff1a;运算器…

【开源项目--稻草】Day04

【开源项目--稻草】Day04 1. 续 VUE1.1 完善VUEAJAX完成注册功能 Spring验证框架什么是Spring验证框架使用Spring-Validation 稻草问答-学生首页显示首页制作首页的流程开发标签列表标签列表显示原理 从业务逻辑层开始编写控制层代码开发问题列表开发业务逻辑层开发页面和JS代码…