Java期末复习基础题编程题

news2024/7/6 17:58:19

文章目录

          • 基础题记录
          • 实践题记录&&与C++比较
            • 题目1:
            • 题目2:
            • 题目3:

基础题记录

image-20220504132606811

编译型语言:

定义:在程序运行之前,通过编译器将源程序编译成机器码(可运行的二进制代码),以后执行这个程序时,就不用再进行编译了。

代表语言:C、C++

解释型语言:
定义:解释型语言的源代码不是直接翻译成机器码,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。在运行的时候才将源程序翻译成机器码,翻译一句,然后执行一句,直至结束。

代表语言:JavaScript、Python

混合型语言:

定义:既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕,就出现了半编译,半解释型语言。

java就是混合型语言

image-20220504133449656

B:编译:javac 文件名.java 运行:java 文件名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g8X5VKdI-1690521510534)(https://gitee.com/aure0219/typora-img/raw/master/202307281313003.png)]

在这里插入图片描述

1、 每个编译单元(文件)只能有一个public 类。这么做的意思是,每个编译单元只能有一个公开的接口,而这个接口就由其public 类来表示。

2、 java程序的入口是main方法,所以被定为public的这个类里一定是含有main方法的类,而且该类的名称要和文件名一致,因为虚拟机开始要找main的。(同个源文件有多个公共类,编译器就找不到应该执行的main方法了)

5

image-20220504135831032

image-20220504135845697

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1tfI1Cvp-1690521638847)(https://gitee.com/aure0219/typora-img/raw/master/202307281314364.png)]

goto是的

image-20220504145952161

定义str必须要双引号,双引号,里面一个字符也没事的,但是就是要双引号

java中的float和C语言不一样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FDtbAzt3-1690521510536)(https://gitee.com/aure0219/typora-img/raw/master/202307281314157.png)]

字符串和int型是可以相加的,即转成字符串

A:float不能变成long,把n改成int也不行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-THEm4sdj-1690521510536)(https://gitee.com/aure0219/typora-img/raw/master/202307281314364.png)]

编译报错:The local variable z may not have been initialized

image-20220504151642218

java中有printf,最终结果是12,x变成了2

image-20220504154153240

实践题记录&&与C++比较
题目1:

image-20220518211258575

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:

image-20220519100733336

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;
	}
	 @Override
	    public 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一样才再去比较每个属性的值
	     */
	    @Override
	    public 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:

image-20220519185341096

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;
}

这题的话,两种语言写法差不多,代码量也差不多

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

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

相关文章

【图像分类】CNN+Transformer结合系列.2

介绍几篇利用CNNTransformer实现图像分类的论文&#xff1a;CMT&#xff08;CVPR2022&#xff09;&#xff0c;MaxViT(ECCV2022)&#xff0c;MaxViT&#xff08;ECCV2022&#xff09;&#xff0c;MPViT&#xff08;CVPR2022&#xff09;。主要是说明Transformer的局限性&#x…

【DFS】CF598D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 直接搜索即可&#xff0c;对于每个连通块都去染色&#xff0c;对于每一个色块都维护这个色块的墙壁数 或者麻烦点用并查集维护也行 Code&#xff1a; int n, m, k; bool st[N][N]; char g[N][N]; int ans[N *…

C#时间轴曲线图形编辑器开发2-核心功能实现

目录 三、关键帧编辑 1、新建Winform工程 &#xff08;1&#xff09;界面布局 &#xff08;2&#xff09;全局变量 2、关键帧添加和删除 &#xff08;1&#xff09;鼠标在曲线上识别 &#xff08;2&#xff09;键盘按键按下捕捉 &#xff08;3&#xff09;关键帧添加、删…

脉冲信号测试应如何选择示波器带宽?

示波器模拟带宽的定义大家都比较熟悉&#xff0c;是针对于正弦波信号定义的。从频域上看&#xff0c;正弦波信号的频谱就是单根谱线&#xff0c;只要示波器的带宽不小于信号的频率&#xff0c;那么就可以有效观测到波形。若要追求更高的幅度测试精度&#xff0c;则可以按照5倍法…

全球视频编码领域顶级大赛放榜,网易云信首次参赛即斩获H.265赛道多项指标第一

近日&#xff0c;2022 MSU 世界视频编码器大赛正式放榜&#xff0c;网易云信首次参赛就获得骄人成绩&#xff0c;自研的结合智码超清技术的 NE265E 编码器以公开身份参赛&#xff0c;在 H.265 赛道下获得多项指标第一名。 首次参赛&#xff0c;斩获 3 项指标第一 MSU Video Co…

【JVM】详细解析java创建对象的具体流程

目录 一、java创建对象的几种方式 1.1、使用new关键字 1.2、反射创建对象 1.2.1、Class.newInstance创建对象 1.2.2、调用构造器再去创建对象Constructor.newInstance 1.3、clone实现 1.4、反序列化 二、创建对象的过程 2.1、分配空间的方式 1、指针碰撞 2、空闲列表 …

Mac代码编辑器sublime text 4中文注册版下载

Sublime Text 4 for Mac简单实用功能强大&#xff0c;是程序员敲代码必备的代码编辑器&#xff0c;sublime text 4中文注册版支持多种编程语言&#xff0c;包括C、Java、Python、Ruby等&#xff0c;可以帮助程序员快速编写代码。Sublime Text的界面简洁、美观&#xff0c;支持多…

数据库访问和组件技术相关概念(ADO、ActiveX、DLL、ODBC等)详解

目录 背景概念ADO核心组件代码展示 ActiveX组件对象模型ADO与ODBC的关系 总结 背景 最近又再重新学习vb&#xff0c;老师说过无论学习什么知识一定不能独立的学习&#xff0c;学习编程语言也是一样&#xff0c;把两种或者三种语言放到一起进行比较&#xff0c;通过比较每种语言…

短视频矩阵源码/系统搭建/源码

一、短视频矩阵系统开发需要具备以下能力 短视频技术能力&#xff1a;开发人员应具备短视频相关技术能力&#xff0c;如视频编解码、视频流媒体传输等。 大数据存储和处理能力&#xff1a;短视频矩阵系统需要处理大量的视频数据&#xff0c;因此需要具备大数据存储和处理的能力…

【Spring Boot】

目录 &#x1f36a;1 Spring Boot 的创建 &#x1f382;2 简单 Spring Boot 程序 &#x1f370;3 Spring Boot 配置文件 &#x1f36e;3.1 properties 基本语法 &#x1fad6;3.2 yml 配置文件说明 &#x1f36d;3.2.1 yml 基本语法 &#x1f369;3.3 配置文件里的配置类…

CSDN浏览如何解决

一、对于平时我们苦恼csdn数据不够好看 当面试等各个场合需要我们装*或者秀技术无法拿出亮眼的时候&#xff0c;刚好我闲时间编译的在线模块适合你 二、如何操作&#xff08;虚拟平台我已给大家放到最后直接使用即可&#xff09; 重点&#xff1a;pc端必须拥有python环境 win…

【lesson6】Linux make和makefile

文章目录 make和Makefile的介绍make和Makefile的使用make和Makefile的项目测试 make和Makefile的介绍 make是一个命令 Makefile是一个文件 make和Makefile是Linux自动化构建项目的工具。 makefile带来的好处就是——“自动化编译”&#xff0c;一旦写好&#xff0c;只需要一个…

6门新兴语言,小众亦强大

编码语言在塑造我们创建软件的方式方面起着至关重要的作用。多年来&#xff0c;我们观察到Python&#xff0c;Java和C等成熟语言的流行。然而&#xff0c;如今一波新的编码语言浪潮已经出现&#xff0c;提出了创造性的解决方案&#xff0c;并推动了软件工程领域所能完成的极限。…

12页线性代数图解教程,github星标9.1k,适合小白

线性代数“困难户”注意&#xff0c;今天我给大家分享一个超适合小白的线性代数学习笔记&#xff0c;只有12页纸&#xff0c;一半都是图解&#xff0c;不用担心看不懂。 这份笔记名为《线性代数的艺术》&#xff0c;是日本学者Kenji Hiranabe基于Gilbert Strang教授的《每个人…

Vue 组件传参 prop/emit

学习了组件用法&#xff0c;就像一种嵌套引用关系&#xff0c;在这个关系中&#xff0c;经常会涉及相互传数据的需求&#xff0c;即父组件传子组件&#xff0c;子组件传父组件。 父、子组件的关系可以总结为&#xff1a; prop 向下传递&#xff08;父传子&#xff09;&#xf…

Docker复习

目录 1. Docker的理解1.1 Docker三要素 2 安装Docker2.1 安装命令2.2 配置阿里云加速器 3 Docker命令3.1 启动类命令3.2 镜像类命令 4 实战4.1 启动容器&#xff0c;自动创建实例4.2 查看Docker内启动的容器4.3 退出容器4.4 其他4.5 导入导出文件4.6 commit 5 Dockerfile5.1 理…

MySQL数据库局域网连接

目录 前言 客户端 开启访问权限 防火墙设置 windows Linux 测试连接 前言 MySQL数据库远程连接&#xff08;局域网&#xff09;是指在局域网内的不同计算机或设备之间&#xff0c;通过网络连接到MySQL数据库服务器的过程。在这种情况下&#xff0c;MySQL数据库服务器位…

编译原理

一&#xff0c;基本概念 二&#xff0c;词法分析

使用python部署chineseocr_lite

使用python部署chineseocr_lite 简介安装报错解决python调用结果 简介 项目地址&#xff1a;https://github.com/DayBreak-u/chineseocr_lite chineseocr_lite 是一个开源项目&#xff0c;用来实现中文的文字识别&#xff0c;支持竖排文字识别、繁体识别&#xff0c;总模型只…

Mysql加锁过程

1、背景 MySQL/InnoDB的加锁分析&#xff0c;一直是一个比较困难的话题。我在工作过程中&#xff0c;经常会有同事咨询这方面的问题。同时&#xff0c;微博上也经常会收到MySQL锁相关的私信&#xff0c;让我帮助解决一些死锁的问题。本文&#xff0c;准备就MySQL/InnoDB的加锁问…