Java期末复习基础题编程题
文章目录
- 基础题记录
- 实践题记录&&与C++比较
- 题目1:
- 题目2:
- 题目3:
基础题记录
编译型语言:
定义:在程序运行之前,通过编译器将源程序编译成机器码(可运行的二进制代码),以后执行这个程序时,就不用再进行编译了。
代表语言:C、C++
解释型语言:
定义:解释型语言的源代码不是直接翻译成机器码,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。在运行的时候才将源程序翻译成机器码,翻译一句,然后执行一句,直至结束。
代表语言:JavaScript、Python
混合型语言:
定义:既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕,就出现了半编译,半解释型语言。
java就是混合型语言
B:编译:javac 文件名.java 运行:java 文件名
1、 每个编译单元(文件)只能有一个public 类。这么做的意思是,每个编译单元只能有一个公开的接口,而这个接口就由其public 类来表示。
2、 java程序的入口是main方法,所以被定为public的这个类里一定是含有main方法的类,而且该类的名称要和文件名一致,因为虚拟机开始要找main的。(同个源文件有多个公共类,编译器就找不到应该执行的main方法了)
5
goto是的
定义str必须要双引号,双引号,里面一个字符也没事的,但是就是要双引号
java中的float和C语言不一样
字符串和int型是可以相加的,即转成字符串
A:float不能变成long,把n改成int也不行
编译报错:The local variable z may not have been initialized
java中有printf,最终结果是12,x变成了2
实践题记录&&与C++比较
题目1:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;public class TotalArea {public static void main(String[] args) {//Map<Integer,Student> mp=new TreeMap<Integer,Student>();Map<String ,Integer>mp=new HashMap<String,Integer>();Map<String,Integer>s=new HashMap<String,Integer>();int n,m,k;Scanner input=new Scanner(System.in);n=input.nextInt();m=input.nextInt();k=input.nextInt();String sas=input.nextLine();//第一个坑for(int i=1;i<=n;++i) {String str=input.nextLine();mp.put(str,0);}for(int i=1;i<=m;++i) {String str=input.next();int score=input.nextInt();s.put(str,score);}for(int i=1;i<=k;++i) {String str=input.next();String ss=input.next();String h=input.next();if(h.equals("AC")) {if(s.containsKey(ss)&&mp.containsKey(str)) //第二个坑mp.put(str, s.get(ss)+mp.get(str));}}Iterator iter=mp.entrySet().iterator();while(iter.hasNext()) {Map.Entry entry=(Map.Entry)iter.next();if(entry.getValue()!=null) //第三个坑System.out.println(entry.getKey()+" "+entry.getValue());} }
}
第一个坑:如果不加这行代码的话,下面的nextline
会先读取换行符(和C++使用getline
差不多)
第二个坑:如果不加这行代码,编译失败Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.Map.get(Object)" is null
,意思就是可能会是null
第三个坑:如果没有这行代码,此时是没有影响的,因为有if(s.containsKey(ss)&&mp.containsKey(str)
的保证
但是如果那行代码,考虑下面的输入
2 2 4
GabrielPessoa
beza
metebronca 100
geometry 200
beza metebronca AC
ffern numbertheory AC
GabrielPessoa geometry WA
beza geometry AC输出
GabrielPessoa 0
beza 300
ffern null
但是这是错误的代码,因为题目说输出 N 行, 第 i 行输出第 i个人的名字和对应分数 (名字和分数用空格隔开)。
而现在的代码输出是随机的,下面是错误样例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rRYI3YHC-1690521510537)(https://gitee.com/aure0219/typora-img/raw/master/202307281314921.png)]
本应该先输出2的,但现在先输出了1
所以要加一个数组来记录他们的顺序
下面来看AC代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;public class TotalArea {public static void main(String[] args) {Map<String ,Integer>mp=new HashMap<String,Integer>();Map<String,Integer>s=new HashMap<String,Integer>();int n,m,k;String []name=new String [1000];Scanner input=new Scanner(System.in);n=input.nextInt();m=input.nextInt();k=input.nextInt();String sas=input.nextLine();for(int i=1;i<=n;++i) {String str=input.nextLine();mp.put(str,0);name[i]=str;}for(int i=1;i<=m;++i) {String str=input.next();int score=input.nextInt();s.put(str,score);}for(int i=1;i<=k;++i) {String str=input.next();String ss=input.next();String h=input.next();if(h.equals("AC")) {if(s.containsKey(ss)&&mp.containsKey(str)) {mp.put(str, mp.get(str)+s.get(ss));}}}for(int i=1;i<=n;++i) {if(mp.get(name[i])!=null) System.out.println(name[i]+" "+mp.get(name[i]));}
// Iterator iter=mp.entrySet().iterator();
// while(iter.hasNext()) {
// Map.Entry entry=(Map.Entry)iter.next();
// if(entry.getValue()!=null)
// System.out.println(entry.getKey()+" "+entry.getValue());
// }
// }
}}
通过name数组来存放相对位置,这样输出的时候也就不需要用迭代器了
再来看看用C++写的代码
#include<bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
map<string,int>people;
map<string,int>score;
int main(void) {
int n,m,k,s1;
string s,x,y;
cin>>n>>m>>k;
while(n--){cin>>s;people[s]=1;
}
while(m--){cin>>s>>s1;score[s]=s1;
}
while(k--){cin>>s>>x>>y;if(people[s]&&y=="AC") people[s]=people[s]+score[x];
}
//map<string,int>::iterator it;
//map<int,map<string,int> >::iterator it;
//for(it=people.begin();it!=people.end();it++){
// if(it->second==0) continue;
// cout<<it->first<<" "<<it->second-1<<endl;
//}
for(auto a:people){if(a.second!=0) cout<<a.first<<" "<<a.second-1<<endl;
}
return 0;
}
//这个写法没考虑到map会按键进行排序,所以输出的时候没按题中输入顺序输出,所以考虑在map前面在加一个参数来记录输入顺序
和java不一样,c++的map会按键进行排序(c++的map相当于java中的TreeMap
)
#include <bits/stdc++.h>
using namespace std;
map<int,map<string,int> >people;
map<string,int>score;
int main(void){int n,m,k;int score1;string str,str1,str2;cin>>n>>m>>k;for(int i=1;i<=n;++i) {cin>>str;people[i][str]=1;}for(int i=1;i<=m;++i){cin>>str>>score1;score[str]=score1;}while(k--){cin>>str>>str1>>str2;if(str2=="AC"){for(int i=1;i<=n;++i){if(people[i][str]>0){people[i][str]+=score[str1];break;}}}}for(int i=1;i<=n;++i){for(auto t:people[i]){if(t.second>0) cout<<t.first<<" "<<t.second-1<<endl;//因为初始化1,所以这里要剪掉1 }}return 0;
}
那如果运用这个思路,用java怎么实现呢
public class Student {public String name;public int score;Student(){};Student(String name,int score){this.name=name;this.score=score;}
}import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.TreeSet;
public class TotalArea {public static void main(String[] args) {Map<Integer,Student> mp=new TreeMap<Integer,Student>();Map<String,Integer>s=new HashMap<String,Integer>();int n,m,k;Scanner input=new Scanner(System.in);n=input.nextInt();m=input.nextInt();k=input.nextInt();String sas=input.nextLine();for(int i=1;i<=n;++i) {String str=input.nextLine();mp.put(i,new Student(str,0));}for(int i=1;i<=m;++i) {String str=input.next();int score=input.nextInt();s.put(str,score);}for(int i=1;i<=k;++i) {String str=input.next();String ss=input.next();String h=input.next();if(h.equals("AC")) {Iterator iter=mp.entrySet().iterator();while(iter.hasNext()) {Map.Entry entry=(Map.Entry)iter.next();if(entry.getValue()!=null) //此时要返回下标,然后进行操作,但现在还未能实现}}}}
}
通过对比,我觉得我在实现类似map类有关操作时,还是C++的STL用的比较熟练,代码量也相对于Java来说较少。
题目2:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class TotalArea {public static void main(String[] args) {Set<Point> p=new HashSet<Point>();Scanner in=new Scanner(System.in);int n=in.nextInt();final int N=600;int [][]ch=new int [N][2];for(int i=1;i<=n;++i) {ch[i][0]=in.nextInt();ch[i][1]=in.nextInt();} for(int i=1;i<=n;++i) {for(int j=1;j<=n;++j) {if(i!=j) {int a=ch[i][0]-ch[j][0];int b=ch[i][1]-ch[j][1];p.add(new Point(a/gcd(a,b),b/gcd(a,b)));}}}System.out.println(p.size());
}
static int gcd(int x,int y){return y==0?x:gcd(y,x%y);
}
}
class Point{private int x;private int y;Point(){};public Point(int x,int y){this.x=x;this.y=y;}
}
下面来看C++AC代码
#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
set<pair<int,int> >mp;//set里面放pair
//map<int,vector<int> >mp;
int ch[510][2];
int gcd(int x,int y){return y==0?x:gcd(y,x%y);
}
int main(void) {
int n;
cin>>n;
for(int i=1;i<=n;++i){cin>>ch[i][0]>>ch[i][1];
}
for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){if(i!=j){int x=ch[i][0]-ch[j][0];int y=ch[i][1]-ch[j][1];// mp.insert(pair<int,int>(x/gcd(x,y),y/gcd(x,y)));//mp.insert(make_pair(x/gcd(x,y),y/gcd(x,y)));mp.insert({x/gcd(x,y),y/gcd(x,y)});//这几种写法都可以的}}
}
cout<<2*mp.size();
return 0;
}
为什么用c++写最后的size要乘2呢,而java直接就是size呢,按代码分析理应是两个都需要*2的,因为一正一负,而存入set中的都是正的
//下面是java的
输入:
3
1 1
4 5
1 4
输出:
3 1
3 4
0 1
3 4
3 1
0 1
6
//发现此时的set并没有去重//下面是C++的
输入:
3
1 1
4 5
1 4
输出:
0 1
3 1
3 4
6
注:在java中set去重是对象去重, 对象内容一样,但对象引用不一样,无法去重
package javafx.geometry;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
public class TotalArea {public static void main(String[] args) {Set<Point> p=new HashSet<Point>();Scanner in=new Scanner(System.in);int n=in.nextInt();final int N=600;int [][]ch=new int [N][2];for(int i=1;i<=n;++i) {ch[i][0]=in.nextInt();ch[i][1]=in.nextInt();} for(int i=1;i<=n;++i) {for(int j=1;j<=n;++j) {if(i!=j) {int a=ch[i][0]-ch[j][0];int b=ch[i][1]-ch[j][1];Point c=new Point(a/gcd(a,b),b/gcd(a,b));p.add(c);}}}Iterator<Point>it=p.iterator();while(it.hasNext()) {Point c=(Point)it.next();System.out.println(c.getX()+" "+c.getY());}System.out.println(p.size());
}static int gcd(int x,int y){return y==0?x:gcd(y,x%y);
}
}
class Point{private Integer x;private Integer y;Point(){};public Point(Integer x,Integer y){this.x=x;this.y=y;}public Integer getX() {return x;}public Integer getY() {return y;}@Overridepublic boolean equals(Object obj) {// System.out.println("调用equals方法,当前的hashCode为:"+hashCode());/** 对象是 null 直接返回 false **/if (obj == null) {return false;}/** 对象是当前对象,直接返回 true **/if (this == obj) {return true;}/** 判断对象类型是否是User **/if (obj instanceof Point) ;Point vo=(Point) obj;/** 比较每个属性的值一致时才返回true **//** 有几个对象就要比较几个属性 **/if (vo.x.equals(this.x) && vo.y.equals(this.y)) {return true;}return false;}/*** 重写hashcode方法,返回的hashCode一样才再去比较每个属性的值*/@Overridepublic int hashCode() {return this.getX().hashCode() * this.getY().hashCode();}
}
这样,才实现了去重功能,上面如果写int
编译过不了的(Cannot invoke equals(int) on the primitive type int
Cannot invoke hashCode() on the primitive type int
),
其中equals
改成==就行了,但是hashCode
怎么改。
那么写成Integer
就不会报错了
输入
3
1 1
4 5
1 4
输出:
0 1
3 1
3 4
3
题目3:
Java代码
import java.util.LinkedList;
import java.util.Scanner;
public class TestCircle {public static void main(String[] args) {LinkedList<Integer> l=new LinkedList<Integer>();Scanner input=new Scanner(System.in);int t=input.nextInt();for(int i=1;i<=t;++i) {String str=input.next();if(str.equals("insert")) {int a=input.nextInt();int b=input.nextInt();l.add(a,b);}else if(str.equals("delete")) {int a=input.nextInt();l.remove(a-1);}else if(str.equals("query")) {int a=input.nextInt();System.out.println(l.get(a-1));}}}
}
当时复制输入数据的时候,发现最后一个query后的值不会输出,debug了好久迟迟发现不了什么问题,以为是代码出现了问题,最后发现还要按一下回车才行。。。。
C++ 代码
#include <bits/stdc++.h>
#include <vector>
using namespace std;
vector<int>G;
int main(void){
int n,x,y;
cin>>n;
string str;
while(n--){cin>>str;if(str=="insert"){//string类型支持直接等于比较cin>>x>>y;G.insert(G.begin()+x,y);}else if(str=="query"){cin>>x;cout<<G[x-1]<<endl;}else if(str=="delete"){cin>>x;G.erase(G.begin()+x-1);}
}
return 0;
}
这题的话,两种语言写法差不多,代码量也差不多
相关文章:

Java期末复习基础题编程题
文章目录 基础题记录实践题记录&&与C比较题目1:题目2:题目3: 基础题记录 编译型语言: 定义:在程序运行之前,通过编译器将源程序编译成机器码(可运行的二进制代码),以后执行这个程序时&…...

资深测试总结,自动化测试-ddt数据驱动yaml文件实战(详细)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 ddt 驱动 yaml/ym…...

F12 浏览器调试模式页面刷新 network 日志刷新消失的解决办法
每次请求刷新后都把之前的请求记录刷新掉了,把preserve log勾选上后,所有的请求都会保留,再也不怕抓不到记录了。...

代理模式-对象的间接访问
现在朋友圈有好多做香港代购的微商,大部分网民无法自己去香港购买想要的商品,于是委托这些微商,告诉他们想要的商品,让他们帮我们购买。我们只需要付钱给他们,他们就会去香港购买,然后把商品寄给我们。这就…...

汽车产业链面临重大变革 大运乘用车加强产业布局 助力低碳出行
当前,国家“双碳”战略的全面实施,全球绿色产业发展理念的不断加深以及汽车产品形态、交通出行模式、能源消费结构变革所呈现的发展机遇等诸多因素,持续推动新能源汽车产业全面转型提速。据悉,2022年,中国新能源汽车销…...

simulink与遗传算法结合求解TSP问题
前言:刚开始入门学习simulink,了解了基本的模块功能后想尝试从自己熟悉的领域入手,自己出题使用simulink搭建模型。选择的是TSP问题的遗传算法,考虑如何用simulink建模思想来实现一个简单TSP问题的遗传算法。 TSP问题描述 一个配…...

环境搭建-Ubuntu18.04.6系统TensorFlow BenchMark的GPU测试
1. 下载Ubuntu18.04.6镜像 登录阿里云官方镜像站:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 2. 测试环境 Server OS:Ubuntu 20.04.6 LTS Kernel: Linux 5.4.0-155-generic x86-64 Docker Version:24.0.5, build ced0996 docker-com…...

C# 汇总区间
228 汇总区间 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围…...

加利福尼亚大学|3D-LLM:将3D世界于大规模语言模型结合
来自加利福尼亚大学的3D-LLM项目团队提到:大型语言模型 (LLM) 和视觉语言模型 (VLM) 已被证明在多项任务上表现出色,例如常识推理。尽管这些模型非常强大,但它们并不以 3D 物理世界为基础,而 3D 物理世界涉及更丰富的概念…...

HCIA实验四
一.实验要求: 1、R4为ISP,其上只能配置IP地址;R4与其他所有直连设备间均使用共有IP; 2、R3 - R5/6/7为MGRE环境,R3为中心站点; 3、整个网络配置OSPF环境,IP基于172.16.0.0/16网段划分&#x…...
常见的算法
查找算法 基本查找 Demo1 public static boolean basicSearch(int index,int[] arr){for (int i 0; i < arr.length; i) {if (indexarr[i]){return true;}}return false; } Demo2 //顺序查找,考虑重复,返回查找内容的索引 public static ArrayLis…...

Jetbrains 2023.2教程
IDEA 2023.2 激活演示 Pycharm 2023.2 激活演示 WebStorm 2023.2 激活演示 Clion 2023.2 激活演示 DataGrip 2023.2 PhpStorm 2023.1.4 激活演示(2023.2尚未发布) RubyMine 2023.2 激活演示 获取方式 仔细看每一个工具演示的图片 本文由 mdnice …...

OpenLayers入门,OpenLayers地图初始化时如何设置默认缩放级别、设置默认地图中心点、最大缩放级别和最小缩放级别以及默认坐标系
专栏目录: OpenLayers入门教程汇总目录 前言 OpenLayers地图初始化时如何设置默认缩放级别、初始化时设置默认地图中心点、设置最大缩放级别和最小缩放级别,超过缩放级别用户无法再放大和缩小,和设置默认坐标系。 二、依赖和使用 "ol": "^6.15.1"使用…...

css实现步骤条中的横线
实现步骤中的横线,我们使用css中的after选择器,content写空,然后给这个范围设定一个绝对定位,相当于和它设置伪类选择的元素的位置,直接看代码: const commonStyle useMemo(() > ({fontSize: 30px}),[]…...

【业务功能篇57】Springboot + Spring Security 权限管理 【上篇】
4.权限管理模块开发 4.1 权限管理概述 4.1.1 权限管理的意义 后台管理系统中,通常需要控制不同的登录用户可以操作的内容。权限管理用于管理系统资源,分配用户菜单、资源权限,以及验证用户是否有访问资源权限。 4.1.2 RBAC权限设计模型 …...

云计算需求激增带来的基础设施挑战及解决方案
云计算的指数级增长迅速改变了我们消费和存储数字信息的方式。随着企业和个人越来越依赖基于云的服务和数据存储,对支持这些服务的强大且可扩展的基础设施的需求已达到前所未有的水平。 云计算需求的快速增长 我们的日常生活越来越多地被新技术所渗透。流媒体服务、…...
R语言中的函数23:zoo::rollmean, rollmax, rollmedian, rollsum等等
文章目录 函数介绍rollmean()rollmax()rollmedianrollsum 函数介绍 rollmean(x, k, fill if (na.pad) NA, na.pad FALSE, align c("center", "left", "right"), ...)rollmax(x, k, fill if (na.pad) NA, na.pad FALSE, align c("cen…...
数据结构—数组和广义表
4.2数组 数组:按一定格式排列起来的,具有相同类型的数据元素的集合。 **一维数组:**若线性表中的数据元素为非结果的简单元素,则称为一维数组。 **一维数组的逻辑结构:**线性结构,定长的线性表。 **声明…...

服务器负载均衡算法有哪些
算法举例 服务器负载均衡算法是用于分配网络流量到多个服务器的策略,以实现负载均衡和提高系统性能。以下是一些常见的服务器负载均衡算法的详细说明: 轮询(Round Robin)算法: 轮询算法是最简单且常见的负载均衡算法之…...

2023年深圳杯数学建模B题电子资源版权保护问题
2023年深圳杯数学建模 B题 电子资源版权保护问题 原题再现: 版权又称著作权,包括发表权、署名权、修改权、保护作品完整权、复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权及应当由著作权人…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...