12.27重构二叉树,插入排序,队列(股票,模拟),后缀表达式求值,括号匹配,验证栈序列,选择题部分

重构二叉树

string in, post;
struct node {char a;node* lchild, * rchild;node(char x='\0') :a(x), lchild(nullptr), rchild(nullptr) {}
};
void so(node* r, int il, int ir, int pl, int pr) {if (il > ir)return;int root;for (root = il; root <= ir; root++) {if (in[root] == post[pr])break;}//找到根节点在中序序列中的位置r->a = in[root];int lsize = root - il;//只含一个端点,不包含根节点rootso(r->lchild,il, root - 1, pl, pl + lsize - 1);//左子树so(r->rchild,root + 1, ir, pl + lsize, pr - 1);//右子树
}
void pre(node* root) {if (!root)return;cout << root->a;pre(root->lchild);pre(root->rchild);
}
cin >> in >> post;
node* root = new node;
so(root, 0, in.length() - 1, 0, in.length() - 1);
pre(root);

一点基本常识,给你一个后序遍历,那么最后一个就是根(如ABCD,则根为D) 

substr与find,由后序与中序

substr返回的是截取后的子串,第一个参数为开始截取的下标,第二个参数为截取的元素个数

find返回下标,

#include <iostream>
#include <vector>
#include <algorithm>
#include<stack>
#include<queue>
#include <map>
#include<string>
#include<cstdio>
using namespace std;
void b(string in, string a) {if (in.size() > 0) {//同理对后序,第k个数下标为k-1,那么第k+1个,下标为k的数,是右子树的第一个数char ch = a[a.size() - 1];//从0截取k个,那么最后一个的下标就是k-1,对于中序而言,下标为k的是第k+1个数,是根节点,那么右子树第一个为k+2,下标为k-1cout << ch;//如果没有第二个参数,就默认从这个起点截取到末尾int k = in.find(ch);//substr第一个参数是截取的起点,第二个参数是截取元素的个数,第二个参数不是截取的终点b(in.substr(0, k), a.substr(0, k));//find返回的是下标,恰好就是左子树里的元素个数b(in.substr(k + 1), a.substr(k, in.size() - 1 - k));//k代表的恰好是左子树里的元素个数,整个数量由一个根节点,左右子树大小构成,所以右子树大小就是减去}
}
int main() {string in, a;cin >> in >> a;b(in, a);return 0;
}

由中序与先序—— P1827 [USACO3.4] 美国血统 American Heritage

void so(string in, string pre) {if (in.size() < 1)return;char ch = pre[0];int index = in.find(ch);//index代表根节点在中序序列中的下标位置,恰好代表左子树大小,因为左子树的最后一个元素下标为index-1,中有元素数量为index-1+1so(in.substr(0, index), pre.substr(1, index));//左子树so(in.substr(index + 1, in.size() - 1 - index), pre.substr(index + 1, in.size() - 1 - index));//右子树cout << ch;
}//先序为根左右,中序为左根右
string in, pre;
cin >> in >> pre;
so(in, pre);
s.find(c);
//在字符串s中查找第一个字符c的位置,返回下标,如果没有返回string::nposs.erase(it);
//在字符串中删除指针it所指向的字符s.begin();
//返回s的首字符的指针(迭代器)
void b(string in, string a) {if (in.size() > 0) {char ch = a[a.size() - 1];cout << ch;//中序为左根右,后序为左右根int k = in.find(ch);//在中序里找根节点的下标,也代表左子树的大小b(in.substr(0, k), a.substr(0, k));//左子树b(in.substr(k + 1), a.substr(1, in.size() - 1 - k));//0是左子树的第一个元素,那么加上左子树大小,指向的是左子树后的第一个元素,即根节点,而不是左子树的最后一个元素,所以要加个1才是右子树的第一个元素}
}
void so(string in, string pre) {if (in.size() > 0) {char ch = pre[0];int index = in.find(ch);so(in.substr(0, index), pre(1, index));//截取第二个参数个元素,从节点开始,所以是不包含右端点的so(in.substr(index + 1, in.size() - 1 - index), pre.substr(1 + index, in.size() - 1 - index));cout << ch;}
}

另一种风格 

前序和后序构建

必要条件为左右子树里都得有元素或者都没有,如果孩子里只有一个元素,因为前序后序的左右孩子都在根节点的一侧,所以就无法区分出这个孩子到底是左孩子还是右孩子,就会产生两种情况,有多少个只有一个孩子的情况,就会有1<<n的情况。即有多少个度为1的节点,就会有1<<n的情况

如果每个节点都有左右孩子或者没有,就不会有其它的情况,情况就是唯一的

重构二叉树干的就几件事,第一件是确定本层的节点,本层的根节点;然后划分出左右子树区间,递归解决

int nfind(char* inorder, int size, char v) {for (int i = 0; i < size; i++) {if (inorder[i] == v)return i;}
}
node* build(char* preorder, char* inorder, int size) {//用char*的话,就是数组,只传数组名,即首个元素的下标接口if (!size)return nullptr;char rd = preorder[0];int leftsize = nfind(inorder, size, rd);node* root = new node(rd);root->lchild = build(preorder + 1, inorder, leftsize);root->rchild = build(preorder + 1 + leftsize, inorder + 1 + leftsize, size - 1 - leftsize);return root;
}
node* buildpre(char* inorder, char* postorder, int size) {if (!size)return nullptr;char rd = postorder[size - 1];int leftsize = nfind(inorder, size, rd);node* root = new node(rd);root->lchild = buildpre(inorder, postorder, leftsize);//加上的数代表差距,从头位置加上左子树的大小,那么最后指向的恰好是左子树后的第一个数,而不是左子树的最后一个数,因为起点不是0,而是1,是左子树里的第一个数root->rchild = buildpre(inorder + 1 + leftsize, postorder + leftsize, size - 1 - leftsize);return root;
}
node* buildin(char* preorder, char* postorder, int size) {if (!size)return nullptr;char rd = preorder[0];node* root = new node(rd);//其它不用特判,因为可以构建出度为1的节点if (size == 1)return root;//由于为满二叉树,此时每个序列要么为叶子节点,要么为出度为2的节点,这里检测前一种情况,即此时序列被拆的都只剩一个元素,不然序列里根本就不存后面的元素int leftsize = nfind(postorder, size, preorder[1]);//由于根节点的位置在前序后序里的位置都是确定的,所以去找左子树的根节点root->lchild = buildin(preorder + 1, postorder, leftsize);root->rchild = buildin(preorder + 1 + leftsize, postorder, size - 1 - leftsize);//这里前一个参数要加1才是右子树的起点,因为要越过根节点和左子树,起点为左子树第一个元素,只加左子树大小时,指向根节点位置,再加1才是右子树的第一个元素位置return root;//这里第一个为根节点,不是左子树的第一个元素,所以加完后指向的是左子树的最后一个元素,再加1就是右子树的第一个元素
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& postorder, int preStart, int preEnd, int postStart, int postEnd) {// 递归终止条件if (preStart > preEnd) {return nullptr;}// 创建当前节点TreeNode* root = new TreeNode(preorder[preStart]);// 在后序序列中找到当前节点的位置int index = postStart;while (postorder[index] != preorder[preStart]) {index++;}// 计算左子树的节点个数int leftCount = index - postStart;// 构建左子树root->left = buildTree(preorder, postorder, preStart + 1, preStart + leftCount, postStart, index - 1);// 构建右子树root->right = buildTree(preorder, postorder, preStart + leftCount + 1, preEnd, index, postEnd - 1);return root;
}TreeNode* buildTree(vector<int>& preorder, vector<int>& postorder) {int preStart = 0;int preEnd = preorder.size() - 1;int postStart = 0;int postEnd = postorder.size() - 1;return buildTree(preorder, postorder, preStart, preEnd, postStart, postEnd);
}

层序重构树

void level(node*& t) {queue<node*>q;int x;cin >> x;if (!x)return;node* t = new node(x);q.push(t);while (!q.empty()) {node* cur = q.front();q.pop();cin >> x;if (x) {cur->lchild = new node(x);q.push(cur->lchild);}cin >> x;if (x) {cur->rchild = new node(x);q.push(cur->rchild);}}
}
void create(node& tree) {char t;cin >> t;if (t == '#') { tree = nullptr; }else {tree = new node;tree->data = t;create(tree->lchild);create(tree->rchild);}
}

 P3884 [JLOI2009] 二叉树问题

这个距离,就是说先向上找最近公共祖先,找的路径乘2,然后找到公共祖先再下来,就不用乘2

#include<bits/stdc++.h>

排序

插入排序

    for (int i = 2; i <= n; i++) {int temp = arr[i], j;for ( j = i - 1; arr[j] > temp && j >= 1; j--) {arr[j + 1] = arr[j];//向后移动这张牌}arr[j + 1] = temp;}
    for (int i = 2; i <= n; i++) {int temp = arr[i], j;for (j = i - 1; arr[j] > temp && j >= 1; j--) {//j代表的是此时比对的位置,从插入的牌的后面第一个开始arr[j + 1] = arr[j];//向后移动这张牌}//由于终止时要么不满足j<1,要么不满足arr[j]>temp,即arr[j]<temp或者已越界,所以此时j所指的是这张牌应在的后一个位置arr[j + 1] = temp;//此一步比这张牌小,后一步就比这张牌大,但是后一步的牌已经覆盖住了后后一步,所以直接覆盖掉它即可}//主要就是因为此时j指向的是,要么比它小的牌,要么越界的第一个,后一步是一定比这张牌大的,所以可以直接赋给下一个指针

归并排序

快速排序

 冒泡排序就是在一个序列当中,从起点开始,不断地往后冒泡交换,每次迭代确定一个最大值,随着冒泡次数的增多,然后最大值确定的也越来越多,需要相邻交换的次数越来越少

即外层循环n次,内层循环n-i次,整体是个n^2的复杂度

选择排序是从0开始保证序列的有序性,每次扩张序列的后一个数,然后和序列的最后一个数作比较,如果比序列的最后一个数大,那么就直接放着;不然,就往前移动,直到前一个数比它小,后一个数比它大,这个数就在有序序列中找到了自己的位置。

队列

7-1 模拟队列 分数 15

要么直接用queue,要么用数组模拟,用数组的话,一个指针表示队头指针,一个指针表示队尾,添加元素时,队尾增加,所以队尾指针增加;出队时,队头出,队头指针++

int p = 1, l = 0;
void push(int num) {q[++l] = num;
}
void pop() {p++;
}
bool empty() {if (l >= p) {return false;}else {return true;}
}
int query() {return q[p];
}

7-3 大師と仙人との奇遇 分数 20

就是队列里记录已经加入的每支股票的价格,然后先比较队头,直到队列为空或者不大于今天的价格就停止,操作完成后再入队今天的

    priority_queue<int, vector<int>, greater<int>>q;int n, num, ans = 0;cin >> n;for (int i = 1; i < n; i++) {cin >> num;if (q.empty()) {q.push(num);}else {while (!q.empty() && q.top() < num) {ans += (num - q.top());q.pop();}q.push(num);}}cin >> num;while (!q.empty()) {int cur = q.top();q.pop();ans += (num - cur);}
    priority_queue<int, vector<int>, greater<int>>q;cin >> n;for (int i = 1; i <= n; i++) {cin >> num;int cnt = 0;if (i != n) {while (!q.empty()) {if (num > q.top()) {q.pop();cnt++;}else {break;}}}else {cnt = q.size();}pin += cnt * num;if (i != n) {pout += num;q.push(num);}}cout << pin - pout << endl;

 

线性表、链表

7-2 后缀表达式求值

    string s1;stack<int>s;int sum, top = 0, num1, num2;getline(cin, s1);//getline函数可以保证输入空格时不中断for (int i = 0; s1[i] != '#'; i++) {if (s1[i] >= '0' && s1[i] <= '9') {sum = s1[i] - '0';//字符数字减去字符0,即可得到正常数字,因为在ASC里是连续的int j;for (j = i + 1; s1[i] != '#'; j++) {if (s1[j] >= '0' && s1[j] <= '9') {sum = sum * 10 + (s1[j] - '0');}else { break; }}if (i > 0 && s1[i - 1] == '-') {sum = -sum;}i = j - 1;s.push(sum);top++;}else if (s1[i] == ' ') { continue; }else if (s1[i] == '-' && s1[i + 1] != ' ') { continue; }else {if (top < 2) {cout << "Expression Error" << s.top() << endl;return 0;}num1 = s.top();s.pop();top--;num2 = s.top();s.pop();top()--;switch (s1[i]) {case '+':s.push(num2 + num1); top++; break;case'-':s.push(num2 - num1); top++; break;case'*':s.push(num2 * num1); top++; break;case'/':if (num1 == 0) {cout << "Error: " << num2 << "/0" << endl;}s.push(num2 / num1);top++;break;}}}if (top != 1) {cout << "Expression Error: " << s.top() << endl;}else {cout << s.top();}
    string s;stack<int>st;int sum, top = 0, num1, num2;getline(cin, s);for (int i = 0; s[i] != '#'; i++) {if (s[i] >= '0' && s[i] <= '9') {sum = s[i] - '0';int j;for (j = i + 1; s[i] != '#'; j++) {if (s[j] >= '0' && s[j] <= '9') {sum = sum * 10 + (s[j] - '0');}else { break; }}if (i > 0 && s[i - 1] == '-') {sum = -sum;}i = j - 1;st.push(sum);top++;}else if (s[i] == ' ')continue;else if (s[i] == '-' && s[i + 1] != ' ')continue;else {if (top < 2) {cout << "E:" << st.top() << endl;return 0;}num1 = st.top();st.pop();top--;num2 = st.top();st.pop();top--;switch (s[i]) {case'+':s.push(num2 + num1); top++; break;case'-':s.push(num2 - num1); top++; break;case'*':s.push(num2 * num1); top++; break;case'/':if (num1 == 0) { cout << "E" << num2 << "/0" << endl; return 0; }s.push(num2 / num1);top++;break;}}}if (top != 1)cout << "E" << s.top() << endl;else cout << s.top();

7-1 字符串匹配问题(strs)

遇到左括号入栈,遇到右括号出栈,

还有就是要注意括号的次序问题,就是把括号

    char a[] = { '{','[','(','<','}',']',')','>' };int b[300], n;cin >> n;while (n--) {string s;cin >> s;stack<int>st;bool flag = true;for (int i = 0; i < s.size(); i++) {for (int j = 0; j < 8; j++) {if (s[i] == a[j]) {b[i] = j;break;//就是把原来的括号字符串转换为B里的数字数组}}}for (int i = 0; i < s.size(); i++) {if (b[i] <= 3) {if (!st.empty() && b[i] < st.top()) {//用数字代表括号的优先次序,那么能不能继续插入,就是看堆顶的元素的编号和此时自己的关系flag = false;//也就是必须要保证一个递增的顺序,不然就不能继续插入break;}else {st.push(b[i]);}//正常插入}else if (b[i] >= 4) {if (st.empty() || (st.top() + 4) != b[i]) {flag = false;break;}else {st.pop();//正常的匹配,删除}}}if (!st.empty())cout << "no" << endl;else if (flag)cout << "yes" << endl;else cout << "no" << endl;}

检验栈序列

    cin >> q;while (q--) {cin >> n;stack<int>s;int cnt = 1;for (int i = 1; i <= n; i++)cin >> push[i];for (int i = 1; i <= n; i++)cin >> pop[i];for (int i = 1; i <= n; i++) {s.push(push[i]);//先入while (!s.empty() && s.top() == pop[cnt]) {//然后一直出队列,要求队列不空而且栈顶元素和Pop此时指向元素相同s.pop();cnt++;}}if (s.empty())cout << "Yes" << endl;else cout << "No" << endl;}

6-2 寻找链表元素的前驱结点

ptr pre(ptr h,int x){ptr res=new node();if(h==nullptr||h->data==x){return NULL;}else{res->next=h;while(h!=NULL){if(h->data==x){return res;}res=h;h=h->next;}}return NULL;/*if(h==NULL){return nullptr;}else{return res;}*/}

线性表删除

List Delete( List &L, ElementType minD, ElementType maxD ){int left=0;int length=L.last;for(int i=0;i<=length;i++){if(L.Data[i]<minD||L.Data[i]>maxD){//L.last--;continue;//这样就表示删掉了}L.Data[left++]=L.Data[i];}L.last=left;return L;
}

栈 

7-3 胡同

    cin >> t;while (t--) {cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];for (int i = 1; i <= n; i++)cin >> b[i];stack<int>st;int cnt = 1;for (int i = 1; i <= n; i++) {st.push(a[i]);while (!st.empty() && st.top() == b[cnt]) {st.pop();cnt++;}}if (st.empty())cout << "yes";else cout << "no";}

括弧匹配,弱化版

    string s;stack<char>ch;bool flag = true;cin >> s;for (int i = 0; i < s.length(); i++) {if (s[i] == '(')ch.push(')');if (s[i] == '[')ch.push(']');if (s[i] == ']') {if (ch.empty()||ch.top()!=']') {flag = false;break;}else {ch.pop();}}if (s[i] == ')') {if (ch.empty() || ch.top() != ')') {flag = false;break;}else {ch.pop();}}}if (ch.empty() && flag) { cout << "ok" << endl; }else {cout << "no" << endl;}

选择题复习

Ologn

看重复执行次数,为1+2+4+……+n,那么最后就是等比数列求和,N可以被视为2的指数次,用等比求和公式算,算完是On的复杂度

链表结点定义为(data,next},在P指向的结点之后插入结点S的代码是 S->next=P->next; P->next=S;

即遍历一次数组,但不需要做任何操作

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

[AI编程]AI辅助编程助手-亚马逊AI 编程助手 Amazon CodeWhisperer

亚马逊AI 编程助手 Amazon CodeWhisperer 是一种基于人工智能技术的编程辅助工具&#xff0c;旨在帮助开发人员更高效地编写代码。它可以提供实时的代码建议、自动补全和错误检查&#xff0c;帮助优化代码质量和提高编程效率。 Amazon CodeWhisperer 使用了自然语言处理和机器…

OpenChat-3.5:70亿参数下的AI突破

引言 在对话AI的发展史上&#xff0c;OpenChat-3.5标志着一个新纪元的到来。拥有70亿参数的这一模型&#xff0c;不仅是对现有语言学习模型&#xff08;LLMs&#xff09;的重大改进&#xff0c;更是在多模态任务中树立了新的标准。 模型概述 OpenChat-3.5作为一款先进的多模…

Leetcode—1572.矩阵对角线元素的和【简单】

2023每日刷题&#xff08;七十三&#xff09; Leetcode—1572.矩阵对角线元素的和 实现代码 class Solution { public:int diagonalSum(vector<vector<int>>& mat) {int n mat.size();if(n 1) {return mat[0][0];}int sum 0;int i 0, j n - 1;while(i &…

ARM CCA机密计算软件架构之RMI领域管理接口与RSI领域服务接口

领域管理接口 领域管理接口&#xff08;RMI&#xff09;是RMM与正常世界主机之间的接口。 RMI允许正常世界虚拟机监视器向RMM发出指令&#xff0c;以管理领域。 RMI使用来自主机虚拟机监视器的SMC调用&#xff0c;请求RMM的管理控制。 RMI使得对领域管理的控制成为可能&…

自动化测试框架知识总结(超详细整理)

一、什么是自动化测试框架 在了解什么是自动化测试框架之前&#xff0c;先了解一下什么叫框架&#xff1f;框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架。前者是从应…

Java多线程常见的成员方法(线程优先级,守护线程,礼让/插入线程)

目录 1.多线程常见的成员方法2.优先级相关的方法3.守护线程&#xff08;备胎线程&#xff09;4.其他线程 1.多线程常见的成员方法 ①如果没有给线程设置名字&#xff0c;线程是有默认名字 的&#xff1a;Thread-X(X序号&#xff0c;从0开始) ②如果要给线程设置名字&#xff0c…

10 分钟了解 nextTick ,并实现简易版的 nextTick

前言 在 Vue.js 中&#xff0c;有一个特殊的方法 nextTick&#xff0c;它在 DOM 更新后执行一段代码&#xff0c;起到等待 DOM 绘制完成的作用。本文会详细介绍 nextTick 的原理和使用方法&#xff0c;并实现一个简易版的 nextTick&#xff0c;加深对它的理解。 一. 什么是 n…

sql优化,内外连接有什么区别

内外连接是啥不必多说&#xff0c;但在做关联查询的时候&#xff0c;二者是有一些区别的&#xff1a; 举例来说&#xff0c;首先是外连接&#xff08;左外连接为例&#xff09;&#xff0c;当两个表都没有索引&#xff0c;就都是全表扫描 EXPLAIN SELECT SQL_NO_CACHE * FROM …

19个Python语法糖和9个内置装饰器

19 个Sweet的 Python Syntax Sugar&#xff0c;用于改善您的编码体验 文章目录 19 个Sweet的 Python Syntax Sugar&#xff0c;用于改善您的编码体验1. 联合运算符Union Operators&#xff1a;合并 Python 字典的最优雅方式2. 类型提示Type Hints&#xff1a;使您的 Python 程序…

EduChat账号密码登录

内测申请&#xff1a;请邮件dan_yhstu.ecnu.edu.cn&#xff0c;以“EduChat内测申请单位”作为邮件标题&#xff0c;邮件内容中写明用途 先去申请个账号和密码&#xff0c;会有一两天延迟吧&#xff0c;挺快的。 拿到账号之后去官网,点一个 官网传送门 就出来用账号密码登录的…

腾讯云轻量服务器和云服务器CVM该怎么选?区别一览

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三…

六、Redis 分布式系统

六、Redis 分布式系统 六、Redis 分布式系统6.1 数据分区算法6.1.1 顺序分区6.1.2 哈希分区 6.2 系统搭建与运行6.2.1 系统搭建6.2.2 系统启动与关闭 6.3 集群操作6.3.1 连接集群6.3.2 写入数据6.3.3 集群查询6.3.4 故障转移6.3.5 集群扩容6.3.6 集群收缩 6.4 分布式系统的限制…

幼儿园:人脸识别门禁技术,可以提高工作效率?

随着社会的不断发展和科技的飞速进步&#xff0c;人脸识别技术已经成为各行各业的一项重要工具。 在幼儿园管理中&#xff0c;人脸识别技术的应用不仅提高了安全性&#xff0c;也优化了接送流程&#xff0c;为幼儿园、家长和孩子们带来了更便捷的管理和服务体验。 客户案例一 …

快解析结合用友T+异地访问解决方案

用友T作为一款纯BS架构软件&#xff0c;外网用户只需打开浏览器&#xff0c;输入域名即可访问T服务器。但是由于网络原因&#xff0c;很多客户没有公网IP&#xff0c;使T远程访问无法实现。快解析云解析版结合T使用&#xff0c;无需公网IP、无需在路由器里开放端口&#xff0c;…

C++系列-第3章循环结构-26-认识do-while语句

C系列-第3章循环结构-26-认识do-while语句 在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 对于 while 语句而言&#xff0c;如果不满足条件&#xff0c;则不能进入循环。但有时候我们需要即使不满足条件&#xff0c;也至少执行一次。 do-while循环…

Vue(一):Vue 入门与 Vue 指令

Vue 01. Vue 快速上手 1.1 Vue 的基本概念 用于 构建用户界面 的 渐进性 框架 构建用户界面&#xff1a;基于数据去渲染用户看到的界面渐进式&#xff1a;不需要学习全部的语法就能完成一些功能&#xff0c;学习是循序渐进的框架&#xff1a;一套完整的项目解决方案&#x…

Redis管道

问题引出 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤&#xff1a; 1 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果)&#xff0c;并监听Socket返回&#xff0c;通常以阻塞模式等待服务端响应。 2 服务端…

深入探究Protostuff枚举类型的序列化

背景&#xff1a; 有一天突然被一个群组排查线上问题&#xff0c;说是一个场景划线价和商品原价一模一样。看到问题时&#xff0c;我的内心毫无波澜&#xff0c;因为经常处理线上类似的问题&#xff0c;但了解业务后发现是上个版本经我手对接的新客弹窗商品算价&#xff0c;内心…

案例237:基于微信小程序的医院挂号预约系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

如何学习TS?

文章目录 一. 8种内置基础类型.ts二. void、never、any、unknown类型void类型never类型any类型unknown类型总结&#xff1a;void和any在项目中是比较常见的&#xff0c;never和unknown不常用。 三. 数组和函数类型定义.ts 一. 8种内置基础类型.ts /* eslint-disable typescrip…