剑指 Offer 31.栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
示例 1:
12345输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), push(4), pop() -> 4,push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
示例 2:
123输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]输出:false解释:1 不能在 2 之前弹出。
提示:
0 <= pushed.length == popped.length <= 1000
0 <= pushed[i] ...
Java 8新特性:函数式接口, Lambda表达式, Stream API, Optional类
在 Java 8 中,增加了Lambda表达式、函数式接口、接口的默认方法和静态方法等语言新特性;在类库方面又新增了Stream API、Optional类等。
接口默认方法从 Java 8 开始接口interface的方法可以使用 default 或 static 修饰,这样就可以有方法体,且实现类不必进行重写。
123456789101112public interface IService { void write(); static void test1() { System.out.println("111"); } default void test2(){ System.out.println("222"); }}
函数式接口函数式接口(Functional Interface)就是有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为 lambda 表达式。
像我们经常使用的 Run ...
SpringBoot实现MySQL读写分离
在高并发下,需要对应用进行读写分离,配置多数据源,即写操作走主库,读操作则走从库,主从数据库负责各自的读和写,缓解了锁的争用,提高了读取性能。
实现读写分离有多种方式,如使用中间件MyCat、Sharding-JDBC等,这里我们使用Aop的方式在代码层面实现读写分离。
实现原理实现读写分离,首先要对Mysql做主从复制,即搭建一个主数据库,以及一个或多个从数据库。
具体实现主从复制,可参照《基于docker实现MySQL主从复制》
使用Aop的方式,当调用业务层方法前,判断请求是否是只读操作,动态切换数据源,如果是只读操作,则切换从数据库的数据源,否则使用主数据库的数据源。
系统架构:rocket: 项目仓库:KimTou/Open-LetFit: LetFit小程序后台开源版
这是我之前写的一个项目,具体代码可以在可以在上面我的GitHub仓库中找到,项目就是使用了本文章介绍的读写分离方式,感兴趣的同学可以作为参考。
代码实现在application.yml配置MySQL123456789101112131415161718192021222324252627282 ...
基于docker实现MySQL主从复制
主从复制工作原理主从复制是MySQL提供的一种高可用高性能的解决方案。
工作原理分为以下3个步骤:
1、主库(master)把数据更改记录到二进制日志(binlog)中。
2、从库(slave)的I/O线程把主库的二进制日志读取保存到自己的中继日志(relay log)中。
3、从库的SQL线程执行中继日志,重做中继日志中的日志,即再执行一遍SQL,更新自己的数据库,以达到数据的一致性。
注意要点:
主从复制不是完全实时地进行同步,而是异步实时。从库同步主库数据的过程是串行化的,也就是说主库上并行的操作,在从库上会串行执行。由于从库从主库拷贝日志以及串行执行 SQL 的特点,会有主从同步时延,在高并发的情况下,该问题就越明显。
作用使用主从复制能够预防MySQ的单点故障,对数据进行备份。
在高并发下,需要对应用进行读写分离,配置多数据源,即写操作走主库,读操作则走从库,以减少锁的争用,此时也需要进行主从复制。
部署数据库实例1、拉取镜像
1docker pull mysql:5.7
2、运行容器
1234# 主库(端口3306)docker run -d -p 3306:3 ...
剑指 Offer 06.从尾到头打印链表
题目描述输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)
示例 1:
12输入:head = [1,3,2]输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
解析方式一:递归法解题思路:递归到链表尾端,在回溯时存入数组。
算法实现:
变量:先创建一个result数组,用size变量记录当前数组的下标索引,node为当前链表结点。
递归结束条件:当链表结点为null,node==null。
结果:result即为逆序排列链表数值后的数组,根据size对数组做截断并返回即可。
1234567891011121314151617class Solution { int[] result = new int[10000]; int size = 0; public int[] reversePrint(ListNode head) { recurGet(head); return Arrays.copyOfRange(result,0,size); } ...
Docker搭建MySQL+Redis+Nginx+MongoDB环境
安装Docker
docker官方文档链接
1、卸载旧版本docker
12345678yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
2、安装需要的安装包(提供实用程序)
1yum install -y yum-utils
3、设置镜像的仓库
12345678# yum-config-manager \# --add-repo \# https://download.docker.com/linux/centos/docker-ce.repo # 默认国外(慢) # 使用阿里云 ...
Centos部署SpringBoot项目(JDK+MySQL+Redis)
安装jdk
将压缩包上传至 /usr/java ,并进行解压
12cd /usr/javatar -zxvf jdk-8u281-linux-x64.tar.gz
设置环境变量
1vim /etc/profile
在文件中添加如下代码
1234export JAVA_HOME=/usr/java/jdk1.8.0_281export JRE_HOME=$JAVA_HOME/jreexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/libexport PATH=$PATH:$JAVA_HOME/bin
保存后使用source使配置环境生效
1source /etc/profile
查看环境是否配置成功1java -version
安装MySQL
下载MySQL官方的Yum Repository的配置文件
1wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm ...
写在开头
关于我本人目前是软件工程专业的一名在读本科生,主要方向是 Java 后台开发。平时也喜欢打篮球与听音乐,欢迎小伙伴与我交流,我的个人邮箱:752160655@qq.com