自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(135)
  • 资源 (1)
  • 收藏
  • 关注

原创 CentOS 7搭建hadoop环境【详细+截图】

CentOS 7搭建hadoop环境寻找网上的博客教程,折腾了许久,出一篇自己成功搭建hadoop环境的文章,用来记录自己的探索,同时为大家伙少走弯路提供捷径一、在虚拟机中安装CentOS 7并克隆两台机子至此机器准备完成二、查看ip地址请查看:CentOS7 入赘虚拟机后,如何查看 ip 地址?三、修改静态ip地址在VM中菜单栏里,编辑->虚拟网络编辑器(用于查看子网ip以及子网掩码)进入虚拟机,输入命令cd /etc/sysconfig/network-script

2020-11-20 00:39:59 17983 13

原创 【代码+注释】求二叉树的深度【超详细】递归+非递归实现

编写算法求出二叉树的深度(层数)二叉树的深度是指从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。本文将用两种方式求出二叉树的深度第一种:无可置疑是递归 核心代码块:/*求二叉树的深度 ,递归方式*/int getDepth(BiTreeNode *root){ int left, right; if (root == NULL) //递归出口 return 0; else {

2020-06-29 22:38:24 19176 7

原创 【代码】求二叉树叶子结点的个数、递归方式

编写算法,求二叉树叶子结点的个数题目分析: 求二叉树的叶子结点,就是求二叉树上左右孩子结点都是空的结点,还记得二叉树的三种遍历方式吗?前序遍历、中序遍历和后序遍历,在递归遍历算法中,无论采取哪种遍历方式,我们只需要添加一个条件就可以求得树的叶子结点啦判断是否是叶子结点的条件是:题中我采用的前序遍历,我们看代码吧建立的二叉树形状:代码实现:注:此代码除《Domain.h》里面的算法之外,其余代码皆为二叉树的基本操作内容,若有不明白的地方可参考文章:树的基本操作BiTree.h

2020-06-29 22:32:36 11769 7

原创 机器学习第一课

为了解决这些问题,研究者提出了许多改进的GAN模型,如深层卷积生成对抗网络(DCGAN)、条件生成对抗网络(CGAN)、生成对抗网络的变种(如WGAN、CycleGAN等),以及一些训练技巧和稳定性优化方法。一个常见的例子是记忆学习。过拟合是指在机器学习中,当我们训练一个模型时,它在训练数据上表现得非常好,但在新的、之前未见过的数据上表现较差的情况。然而,这些任务之间可能存在一些共享的特征或知识,迁移学习的目标就是利用这些共享的信息,将已学习到的知识迁移到新任务上,从而更高效地解决新任务。

2023-12-16 16:09:10 865 1

原创 Redis单线程、持久化、主从、哨兵的理解与实验

工作原理:在做AOF时,会先把内存中已有的数据用RDB做快照处理,在保存的过程中,会有新的命令产生结果集,新的结果集就用AOF保存,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。redis的单线程是指对网络IO和键值对的读写由一个线程来执行,但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。

2023-12-10 22:02:50 854

原创 Linux是如何接收数据包的

内核是通过注册的方式来实现的。igb_open调用了igb_setup_all_tx_resources和igb_setup_all_rx_resources,在igb_setup_all_rx_resources这一步,分配了RingBuffer,并建立内存和Rx队列的映射关系。每一个驱动程序会使用module_init向内核注册一个初始化函数,当驱动程序被加载时,内核会调用这个函数,然后内核就知道了该驱动的相关信息,比如igb网卡驱动的igb_driver_name和igb_probe函数地址。

2023-12-10 21:19:05 894

原创 Linux是如何发送数据包的

软中断是由内核线程来运行的,该线程会进入到 net_tx_action 函数,在该函数中能获取到发送队列,并也最终调用到驱动程序里的入口函数 dev_hard_start_xmit。当满足真正发送条件的时候,无论调用的是 __tcp_push_pending_frames 还是 tcp_push_one 最终都实际会执行到 tcp_write_xmit。对于TCP协议来说,那就是tcp_sendmsg,在这个函数中,内核会申请一个内核态的skb内存,将用户发送的数据拷贝进去。因为内存还没有清理。

2023-12-09 01:54:49 888

原创 Result Maps collection already contains value for cn.onedawn.mapper.DepartmentMapper.BaseResultMap

标题Result Maps collection already contains value for cn.onedawn.mapper.DepartmentMapper.BaseResultMap原因:我使用了 mybatis-generator 插件生成mapper.xml,生成了两次,插件在mapper.xml后面追加的内容解决方式:把多余的清除就好了...

2021-09-30 21:30:43 247 1

原创 getDeclaredMethod和getMethod的区别

看了Java api文档,容易搞忘,还是敲一遍吧,得出结论,加深记忆~结论加了Declared:只能获取当前类的方法,包括私有方法(不能invoke)不加Declared:可以获取当前类以及超类的方法,但只能是public方法。不能invoke本地(native)方法代码示例import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.lang.reflect.Mod

2021-08-26 11:53:15 620

原创 【实操】自定义类加载器、打破双亲委派机制

今天周末在家,看看电影,写写代码来实践一把自定义类加载器、打破双亲委派机制,记录下踩坑自定义类加载器步骤:继承ClassLoader重写findClass方法自定义MyClassLoaderimport java.io.FileInputStream;import java.io.IOException;/** * Created by IntelliJ IDEA * User: yqm02 * Date: 2021/8/22 * Time: 16:14 */public

2021-08-22 22:03:41 309

原创 Java类中写了main方法,但是没有run按钮

问题现象原因是我在classpath下面自定义了一个String类而main方法的参数String,要求是JDK自带的java.lang.String类。解决方法就是把classpath下面的String删除,run按钮就出来了

2021-08-22 18:13:41 1917 2

原创 理解dubbo概念

文章目录一、负载均衡1. 随机(random)2. 轮询(roundRobin)3. 最少活跃调用(leastActive)4. 一致性Hash(ConsistentHash)二、集群容错1. failover2. failfast3. failSafe4. failBack5. forking6. broadcast三、服务降级四、本地存根五、参数回调六、泛化调用dubbo最基础的用法就是远程调用,服务端给消费者提供服务,但是dubbo也提供了额外的一些高级用法一、负载均衡大型架构里面,通常不止一台

2021-08-01 17:11:26 187

原创 MySQL-explain用法解析

在MySQL中查询语句写得很多,在高并发情况下往往我们需要考虑数据库的查询效率,以提高用户体验感。怎么知道一条select语句的执行效率??MySQL 提供了一个关键字——Explain在select语句前面加上这个关键字就可以知道select语句的执行具体情况在Explain会列出几个字段,告知开发者,主要有:解释一下他们都代表着什么意思先奉上一个总图:id有几个select就有几个id,id越大优先级越高,id相同就从上往下执行,id为NULL最后执行select_type(5种)

2021-06-18 11:20:56 502 1

原创 安装多个JDK,出现has been compiled by a more recent version of the Java Runtime (class file version 55.0)

报错如下:Exception in thread “main” java.lang.UnsupportedClassVersionError: com/User has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0at j

2021-06-03 10:53:40 2292 3

原创 深入理解JVM虚拟机栈是如何工作的?

虚拟机栈是Java虚拟机运行时数据区的一部分虚拟机栈、本地方法栈和程序计数器是线程私有的,它们之间的关系如图所示:本文主要探索虚拟机栈的内存结构。虚拟机栈的结构组成一个线程可能会执行多个方法,在虚拟机栈里面,每个方法都会有一个栈帧。一个栈帧就相当于堆栈的一个元素。当准备执行方法的时候,就把栈帧压入栈中,方法执行完毕后就出栈。虚拟机栈的内部由局部变量表、操作数栈、动态链接、方法出口组成如图所示:局部变量表负责存储方法内定义的局部变量,操作数栈主要是存储常量、对象地址,而动态链接就是解析在方法

2021-05-31 09:30:03 304

原创 垃圾回收算法和垃圾回收器

常用垃圾回收算法标记-清除算法过程:扫描一遍堆内存,对要清除的对象进行标记,扫描完成之后会一起清除速度非常快,缺点是会产生大量的空间碎片标记-复制算法过程:先将内存区域分成左右两块,右边一块空着,左边来存放对象。在回收的时候,会扫描左边的那一块空间,将要保留的对象复制到右边存储下来,这个存储是有顺序并且排列整齐的,然后清除掉左边区域。速度慢并且浪费了一半的空间,但是不会产生空间碎片标记-整理算法过程:遍历GC Roots,将要保留的对象标记,移动所有需要保留的对象,按

2021-05-10 09:12:09 252

原创 hashCode()和equals()的关系,为什么重写了equals,必须重写hashCode方法?

hashCode()和equals(),都属于Object类里面的方法,因此所有的Java类都含有这二方法。三条:一、equeals相等,那么hashCode一定相等二、hashCode相等,那么equals不一定返回true三、hashCode不相等,那么equals一定不相等因此,equals比hashCode更加复杂,它判断的相等与否更加绝对,更加有效。hashCode()该方法的作用就是获取哈希码,哈希码是一个int型数字,用来确定对象在哈希表中的索引位置。为什么有了equals这样有

2021-02-20 17:37:58 157

转载 匿名内部类的特点

匿名内部类就是没有名字的内部类特点:必须继承一个抽象类或者实现一个接口匿名内部类不能定义任何静态成员和静态方法当所在的方法的形参需要被匿名内部类使用时,必须声明为final (jdk8之前要手动加上final,在jdk8及以后编译会帮我们自动加上final)原因:生命周期不一致局部变量存储在栈中,当方法执行结束后,非final的局部变量就被销毁。而局部内部类对局部变量的引用依然存在,如果局部内部类要调用局部变量时,就会出现错误,或者说不是程序员想要的结果。如果加了final,可以确保局部内

2021-02-20 16:50:25 789

原创 全国高校计算机能力挑战全国总决赛java题解(2020第二届)

我参加的第二届(2020年),国二12月20日的决赛,因为抓期末复习,所以现在才出这篇题解决赛有6个编程题一题目描述某高校食堂开办了一个自助餐厅,使用智能餐盘和自动结算,计算学生餐费。智能餐盘能够识别所打莱品类型,重量,单价(计价单位为:元/100克)食堂计划以每道菜、汤独立定价;主食200克以内免费,200克以上部分收费(如果打了多道主食,依据输入次序累计免费200克以下部分)为鼓励学生健康饮食,学校鼓励学生联网分享运动信息,参照计步数进行阶梯折扣,0-5999步不打折,6000-9999

2021-01-01 21:01:22 1313 1

原创 微机接口技术及应用(纯手打)——期末复习用

目录概述总线I/O地址译码技术定时、计时技术中断技术DMA技术并行接口串行通信接口一、概述接口的作用?进行CPU与设备之间的信息交换接口的基本任务?(1)实现设备与总线的连接(2)连接后,CPU对设备进行操作或控制用户接口是所有微机系统都必须具有的接口层次设备接口和总线桥的概念(1)设备接口:I/O设备与本地总线之间的连接电路并进行信息交换的中转站,直接传递(2)总线桥:连接的是本地总线与PCI总线,间接传递(映射)为什么要设置I/

2021-01-01 11:51:38 1675

原创 【贪心】发工资——贪心算法入门题目

原题链接问题描述作为程序猿,最盼望的日子就是每月的9号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵但是对于公司财务处的工作人员来说,这一天则是a很忙碌的一天,财务处的小李最近就在考虑一个问题:如果每个员工的工资额都知道,最少需要准备多少张人民币,才能在给每位员工发工资的时候都不用员工找零呢?这里假设程序猿的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。输入输入数据包含多个测试实例,每个测试实例的第一个数是一个整数n(n<100),表示员工的人数

2020-12-23 12:01:08 1281

原创 回溯算法的经典例题——素数环、皇后问题、马踏棋盘

回溯算法的经典例题(1)含有重复字母的字符串全排列问题(2)素数环(3)八皇后问题(4)八皇后变换~X皇后(5)八皇后变换~格子之和最大(6)八皇后变换~2n皇后(7)马踏棋盘(8)有蹩脚的马踏棋盘...

2020-12-23 11:06:52 204

原创 【回溯】八皇后变换-2n皇后

原题链接问题描述给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。输入输入的第一行为一个整数n,表示棋盘的大小。接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。输出输出一个整数,表示总共有多少种放法。解法:回溯回溯思路先填好白

2020-12-23 10:47:44 125

原创 【回溯】八皇后问题变换-格子之和最大

原题链接问题描述规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。输入一个8*8的棋盘。输出所能得到的最大数字和解法:回溯选择最优思路:(1)当8行都符合八皇后的规则后,计算方案数在棋盘上的值(2)值越大就取代码/** * 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。 * 解法:在八皇后的基础上增加比较条件 */public class Main { /* 输入的棋盘 */ static int[

2020-12-23 10:46:57 653

原创 【回溯】八皇后问题变换-X皇后

原题链接问题描述请输出字典序最小的x皇后问题对应的排列。输入一个数x输出包括一行,输出1~x的一个排列,满足x皇后问题的要求。解法:老规矩回溯求解思路回溯是按照深度搜索来的,搜索出来的第一个答案就是字典序就是最小,打印输出即可代码import java.util.Scanner;/** * 请输出字典序最小的x皇后问题对应的排列。 * (x<=10) */public class Main { public static void main(String[

2020-12-23 10:45:59 133

原创 【回溯】八皇后的方案数——经典巨无霸

问题描述:皇后问题是指在8*8的棋盘上放置8个皇后,使这8个皇后无法吃掉对方(也就是说两两不在一行,不在一列,也不在对角线上),求放置皇后的方案数输入:无输出:一个整数,表示方案数解法:回溯试探思路(1)用一个数组arr表示放置的方式,例如arr[i] = j表示在第i行第j列放置一个皇后,i和j均从0开始,即0表示第一行(列)(2)一行一行的放置皇后,挨个位置进行试探,如果该位置可用,继续进行下一行的试探,如果该位置不可用,那么回退,将这个皇后放置到下一列(3)直到行数等于8,方案数

2020-12-23 10:45:09 169 1

原创 【回溯】原生的马踏棋盘——贼强

问题描述在N*N棋盘上,任意一个位置放置一个棋子马,要能选择一套合适的移动路线,按象棋中“马走日”的移动规则不重复地遍历棋盘上每一个位置点。输入第一行,一个正整数n。第二行包含两个整数,表示原点在棋盘中的位置输出输出遍历棋盘的路径或者“没有找到全遍历路径解法:回溯搜路径思路(1)从源点开始,向各个方向试探(2)如果当前跳法符合条件,就继续以当前位置为源点,向各个方向试探(3)如果当前位置已经被占了,就回退到上一个位置,向其他方向跳(4)棋盘已满时,遍历输出,结束程序代码impo

2020-12-23 10:44:18 221

原创 【回溯】有蹩脚的马踏棋盘——思路巨清晰!!!

问题描述在上一个问题的基础上,如果事先将棋盘中设置有的地方已经被占据,马跳的过程中可能被别脚,如果马能够跳完剩下的棋盘,则遍历输出路径,如果不能跳完,则打印“没有找到全遍历路径”输入输入的第一行包含一个正整数n(n< =100)。第二行为一个小于n * n的整数m。接下来m行都包含两个整数,每一行代表第i行,第j列的位置已经有棋子。接下来一行包含两个数,代表起点。输出马的遍历路径或者“没有找到全遍历路径。解法:回溯剪枝思路(1)思路同上一题目一样,区别在于判断下一个位置是否可行

2020-12-23 10:43:34 277

原创 【回溯】含有重复字母的字符串全排列问题

问题描述:输出字符串的全部排列顺序,可能含有重复字母输入:两行,第一行表示字符串长度(<100)第二行为个长度大于0小于100的字符串输出:若干行,第一行表示全排列的种数接下来每行表示一种排列方式解法:回溯去重思路(1)将第一个字母与第二个字母交换,输出一种排列(2)然后将第一个字母与第三个字母交,输出一种排列(3)但是在(1)(2)之间存在一个问题,当(1)执行了之后紧接着执行(2),其效果是第三个字母和第二个字母交换(因为在(1)中第一个字母已经和第三个字母产生交换了)

2020-12-23 10:42:27 993

原创 【回溯】素数环——代码超清晰!!!

问题描述:输出字符串的全部排列顺序,可能含有重复字母输入:两行,第一行表示字符串长度(<100)第二行为个长度大于0小于100的字符串输出:若干行,第一行表示全排列的种数接下来每行表示一种排列方式解法:回溯去重思路(1)将第一个字母与第二个字母交换,输出一种排列(2)然后将第一个字母与第三个字母交,输出一种排列(3)但是在(1)(2)之间存在一个问题,当(1)执行了之后紧接着执行(2),其效果是第三个字母和第二个字母交换(因为在(1)中第一个字母已经和第三个字母产生交换了)

2020-12-23 10:38:59 822

原创 剑指 Offer 31. 栈的压入、弹出序列——堆栈的匹配

原题链接题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), pus

2020-12-22 23:02:01 174

原创 剑指 Offer 32 - II. 从上到下打印二叉树 II——利用队列层序遍历BFS

原题链接题目描述从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树: [3,9,20,null,null,15,7],​ 3/ 9 20/ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]]限制节点总数 <= 1000解法:利用队列特性层序遍历思路代码public List<List<Integer>> levelOrder(TreeNode root) {

2020-12-20 16:22:58 81

原创 剑指 Offer 30. 包含min函数的栈——辅助栈、垫次小值两种解法!!!

原题链接题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中调用 min、push 及 pop 的时间复杂度都是 O(1)。示例MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top(); -->

2020-12-19 12:00:46 90 1

原创 背包问题【代码+注释】01背包、完全背包、多重背包——动态规划经典

描述:有n个物品,每个物品的重量为weight[i],每个物品的价值为value[i]。现在有一个背包,它所能容纳的重量为total,问:当你面对这么多有价值的物品时,你的背包所能带走的最大价值是多少?思路:明确dp数组的意义:dp[i] [j]表示,当我现在只有前i个物品以及j个空间时,背包能带走的最大价值寻找递推关系:当遍历到某个物品时,我们所面临的问题是,装不装这个物品装:上一个物品计算之后加上这个物品的价值,dp[i - 1] [j – weight[i]] + value[i]

2020-12-18 13:47:37 321

原创 剑指 Offer 29. 顺时针打印矩阵——控制好数组边界

原题链接题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]限制0 <= matrix.length <= 1000 <= matrix[i].length <

2020-12-18 11:23:26 107

原创 【效率百分百】剑指 Offer 28. 对称的二叉树——递归解法!!!

原题链接题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ \2 2/ \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ \2 2\ \3 3示例 1输入:root = [1,2,2,3,4,4,3]输出:true示例 2输入:root = [1,2,2,null,3,null,3]输出:false限

2020-12-18 10:16:42 114

原创 【效率百分百】剑指 Offer 27. 二叉树的镜像——交换左右子树

原题链接题目描述请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:4/ \2 7/ \ / \1 3 6 9镜像输出:4/ \7 2/ \ / \9 6 3 1示例 1输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]限制0 <= 节点个数 <= 1000解法:递归遍历时交换左右子树代码public TreeNode mirrorTree(TreeNode root) { if(root ==

2020-12-18 10:14:33 125

原创 【效率百分百】剑指 Offer 26. 树的子结构——匹配结点

原题链接题目描述输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A:3/ \4 5/ \1 2给定的树 B:4/1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。示例 1输入:A = [1,2,3], B = [3,1]输出:false示例 2输入:A = [3,4,5,1,2], B = [4,1]输出:true限制0 <= 节点个

2020-12-18 10:13:23 87

原创 剑指 Offer 25. 合并两个排序的链表——最快的解法

原题链接题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1输入:1->2->4, 1->3->4输出:1->1->2->3->4->4限制0 <= 链表长度 <= 1000解法思路建立一个假的头结点和当前结点curr指向假头结点同时遍历两条链表,将较小的结点添加到当前结点的后面有一条链表遍历完后,将另一条链表剩余的结点添加到curr结点后面,返回头结点的next代码/*

2020-12-17 09:35:39 65

原创 【经典逆置】剑指 Offer 24. 反转链表——写了无数遍

原题链接题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL限制0 <= 节点个数 <= 5000解法:经典的就地逆置单链表和《剑指offer》06题换汤不换药,就地逆置单链表,这里不再赘述,我的这篇文章有详细的图文讲解:就地逆置单链表再次附上代码:/* 就地逆置单链表 */private

2020-12-16 11:18:03 86

课程管理系统演示.mp4

数据库课程大作业设计演示视频——课程管理系统

2021-05-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除