Excel笔记
Excel 批量填充单元格
软件:Microsoft Office Excel
关于在Excel中进行批量填充单元格的操作
在Excel表格操作时,我们通常会遇到一列中许多连续数据需要填充,而这时直接填充会出现只能选择某一个数据填充所有。数据如下图所示
1.我们只需要选择第一列,通过快捷键Ctrl + H 将“-”替换成空值
2.选中第一列,使用快捷键Ctrl + G ,点击“定位条件”,选择“空值”,定位空值的单元格
3.点击上方的内容输入列,输入第一个空值单元格中的公式(“=上一个单元格”)(等会需要用来给后面的数据填充使用)。如图:
4.然后使用Ctrl + D快捷键 进行填充就完成填充数据(此时所有的空的单元格的数据会指向上一个单元格的内容)
5.(额外的)如果不想要公式,可以将这列的数据复制到别的行,然后在通过数值粘贴以达到纯数据的形式。
Excel 批量合成单元格
批量合并一列的相同单元格
软件:Microsoft Office Excel
关于在Excel中进行批量合并单元格的操作
在Excel表格操作时,我们通常会遇到许多数据连续一致,这时我们需要合并这些单元格,例如下面的表格我们需要合并人员相同的单元格,同时将工作单位一并合并。
此时只需要选中人员列(不包括标题)
选择 “数据”–>“分类汇总”
得到如下图表
接着选中最左列,通过Ctrl + G快捷键,选择空值查找,如图所示:
筛选出对应的空值单元格(即要合并的列)
同时点击**“开始”–>“合并后居中”**
再次选择最左列,此时再点击**“开始”–>“格式刷”**,将格式刷到需要对应格式的列
再次在最左列使用Ctrl + G快捷键,选择常量查找
此时右击选中的单元格,点击“删除”,选择整行,合并就算完成了,如有其它行需要,格式相同的可以使用格式刷,不同的则可以再次采用此方法。
MySQL相关知识点
MySQL知识点
MySQL
存储引擎
InnoDB( 默认引擎,支持外键;支持事务;支持在线热备份)
MyISAM(不支持外键、事务和在线热备份;不支持行锁,只支持表锁;支持压缩表和空间数据索引)
Memory(存在内存中 一但机器重启 数据会丢失)
MERGE(用于一系列MyISAM表以逻辑方式组合在一起,作为一个对象去引用。(相当于union all))
事务的四大特性
原子性:所有操作要么全部成功,要么全部回滚
一致性:事务执行前和执行后必须处于一致性状态
隔离性:并发访问数据时,多个事务互相不干扰
持久性:事务一旦提交,对数据库的更改就是永久的
事务会出现的问题
脏读:指的是当前事务可以读取到另外事务未提交的数据。
不可重复读:同一事务内多次读取同一数据集合,读取到的数据是不一样的情况。
幻影读:同一事务连续执行两次同样的 sql 语句,第二次的 sql 语句可能会返回之前不存在的行(特殊的不可重复读问题)
四种事务隔离级别
未提交读(READ UNCOMMITTED)
事务中的修改,即使没有提交,对其他事务也是可见的。
会出现如下问题:脏读 不可重复 ...
Spring相关知识点
Spring知识点
Spring框架
依赖注入,控制反转的介绍
控制反转指的是一个过程,将原本对象自己控制的依赖关系变成外部容器来进行控制。
依赖注入是它的实现方式,Spring容器通过构造函数或者setter方法将依赖关系注入到对象中
Bean的注入方式
引导加载方式:通过Xml文件或者Java注解(@Bean注解)来实现
自动配置:即
①自动装配(声明setter方法,@Autowired 根据类进行匹配,多个则根据名字匹配(设置**@Qualifier注解可以指定Bean的名称)(设置required参数可以让其在找不到时不报错**),@Resouce JDK提供的 查找方式反一下)(在Bean上使用**@Primary注解可以设置多个匹配时的主类**。)
②组件扫描(@ComponentScan注解 默认会在当前包路径下扫描)
自动装配的过程:再创建上下文时进行注册Bean定义,在Bean的实例化时进行解析(根据注解类型来选择执行Bean的后置处理器进行解析)
Spring IoC容器加载的流程
注册容器时,会先注册启动配置类,然后调用refresh() ...
JVM相关知识点
JVM相关知识点
JVM
自动内存管理子系统
运行时数据区:
方法区(线程共享的)
主要存储对象的元数据信息(类名,字段信息,方法信息,父类信息等)和运行时常量池(字符串(JDK1.7以前是存放的对象,后面改成了存放引用,对象放到堆内存中了)/数值/布尔字面量,符号引用(类全限定名,字段的描述信息,方法的描述信息))
实现方式
JDK1.8以前实现方式是永久代(主要为了适配堆的分代结构方便垃圾回收器一起管理)
JDK1.8后采用元空间实现(使用本地内存来存储,与堆内存分离,内存大小可以动态扩展,大大减少了内存溢出的风险)
堆(线程共享的)
对象的创建过程
当JVM遇到一条new语句时,会先去找常量池找到此类的符号引用,并检查它是否已加载,否则执行类加载过程,通过后,JVM会为新对象在堆中分配固定内存(其大小在类加载完成后便以确定),同时初始化零值(对象头除外),接着设置对象头(锁状态信息,GC分代年龄,类型指针(指向它的类型元数据的指针)等,如果是数组则还要记录它的长度),在JVM看来此时对象已经真正创建完成;接着将会执行方法才按照我们的意愿操作
对象的 ...
力扣45跳跃游戏 II
题目描述:
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
与另一个(力扣55)十分相似,最短的跳跃距离,依旧是贪心,只要让位置跳的尽量远即可
真就贪心,想不到那就做不出来,无语,这种题目是真没意思,不过得注意不像上一题只要维护最大值,现在还要维护最大步长
12345678910111213141516171819//代码如下 public int jump(int[] nums) { if (nums.length == 1) return 0; int max = 0;//当前步长能走的最大值,也即下次的步长 int step = 1;//当前步数 int s ...
力扣55跳跃游戏
题目描述:
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
经典跳跃小游戏,简单的dp缓存表最好想了
1234567891011121314151617181920212223//代码如下 //缓存表 //dp2是和下面优化的代码有所区分无意义,int类型是因为存三个状态:能到,不能到,未缓存 int[] dp2; public boolean canJump(int[] nums) { dp2 = new int[nums.length]; return f(nums, 0); } public boolean f(int[] nums, int index) { //basecase if (index > nums.length - 1) return false; if (dp2[index] != ...
力扣189 轮转数组
题目描述:
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
题目非常简单,分成两段数组分别赋值即可,不过注意是检查的依旧是原数组
123456789101112//代码如下 public void rotate(int[] nums, int k) { int[] temp = Arrays.copyOf(nums, nums.length); k = k % nums.length;//超过一圈后都是循环 for (int i = 0; i < nums.length - k; i++) { nums[i + k] = temp[i]; } for (int i = nums.length - k; i < nums.length; i++) { nums[i - nums.length + k] = temp[i]; } }
空间复杂度优 ...
力扣169 合并两个有序数组
题目描述:
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
题目非常简单,让我们找出现次数最多的数,使用Hash表应该是最好想到的,不多赘述。
12345678910111213//代码如下 public int majorityElement(int[] nums) { if (nums.length <= 2) return nums[0];//特殊情况,直接返回 HashMap<Integer, Integer> map = new HashMap<>(16); for (int i = 0; i < nums.length; i++) { if (!map.containsKey(nums[i])) map.put(nums[i], 1);//不存在创建添加 else { ...
力扣80 删除有序数组中的重复项 II
题目描述:
给你一个有序数组 nums ,请你** 原地** 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
与leetcode26优化后的结果差不多:
我们看看能不能优化一下,依旧是大小不重要,所以依旧在原数组上进行修改遍历,我们可以通过记录当前应该去重的数据数量来确定当前数据如果不重复应该移动的位置,不过题目要求是重复两次以上,所以额外再加一个变量记录重复次数。
这样分析会有三种情况
当前数据位置与索引位置相等:重复次数+1
且数据重复次数大于两次:则应该去重的数量+1
否则少于两次应该保留:即需要移动数据
当前数据位置与索引位置不相等:重复次数重置为1,保留(移动)数据
注意的是:移动数据的目的就是为了保留此数据,因为后面的数据不参与答案校验
1234567891011121314151617181920//代码如下 public int removeDuplicates(int[] nums) { ...