自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

嗷嗷嗷嗷的博客

Java后端知识分享 以及 LeetCode刷题

  • 博客(120)
  • 收藏
  • 关注

原创 SpringBoot中@WebFilter过滤器在jar包和war部署的效果不一样

我们需要注意:在 使用Springboot 内置的容器时 (jar包中内嵌Tomcat),@WebFilter @WebListener这类注解,需要通过@ServletComponentScan注释,才能被使用而打成war包, 则是使用built-in discovery mechanismsspring容器的内置发现机制,从下面@WebFilter定义来看,它并不是一个能被扫描到的bean,所以若想部署到war包,需要在程序中加上@Compoment注解@WebFilter的注解定义@Tar

2021-01-23 16:30:10 964

原创 常见排序算法

public void quickSort(int[] arrs){ quickSortCore(arrs, 0, arrs.length - 1);}public void quickSortCore(int[] arrs, int low, int high){ if (low >= high) return; int mark = arrs[low]; int i = low, j = high; while (i < j) { while (arrs[j] >

2021-01-07 11:10:28 193 1

原创 手写RPC框架之动态代理实现远程服务调用

的撒旦

2020-12-21 19:19:15 603

原创 Spring 中的 bean 生命周期(代码实现)

Bean的生命周期下图是标准的Bean的生命周期为了更好理解,可以重构成实例化、属性注入、初始化、销毁四个主要部分,其余部分相当于使用AOP技术,如果实现了相关接口,才会有这些过程。从代码看Bean的生命周期Person :自定义Beanpublic class Person implements InitializingBean, BeanNameAware, BeanFactoryAware, ApplicationContextAware { private String n

2020-12-15 21:51:11 857

原创 手写RPC框架之网络传输协议设计及实现

本文主要介绍my-rpc框架中网络传输数据的格式设计,以及如何在发送和接收数据的过程中进行的编解码过程。网络传输协议设计数据在网络中是以字节(二进制)的形式传输的,要让通信的双方都能正确的接收对方发送的信息,一定要定义好数据格式,要让对方知道如何解析,从哪一位开始到哪一位代表什么含义,数据的总长度是多少,以避免多读或少读发生解析错误和粘包等问题。参考TCP协议对TCP数据包的设计,以下是my-rpc框架设计的网络传输的数据包(my-rpc-package)格式,分为header和body两部分:

2020-12-10 15:45:59 631 2

原创 手写RPC框架之序列化协议选择

1 序列化介绍2 JDK自带的序列化方式3 KryoKryo github官网:https://github.com/EsotericSoftware/kryo在Dubbo中使用高效的Java序列化(Kryo和FST)public interface Serializer { /** * 序列化 * @param obj 序列化对象 * @return 字节数组 */ byte[] serialize(Object obj); /

2020-12-08 17:32:42 356

原创 *LeetCode 338 比特位计数(中等)

给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例 2:输入: 5输出: [0,1,1,2,1,2]进阶:给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?要求算法的空间复杂度为O(n)。你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __bui

2020-12-08 11:37:22 83

原创 CentOS7 安装Tomcat9

Tomcat安装需要依赖JDK环境,所以需要先安装JDK1.8以上版本。Java环境安装检查JDK环境java -version 查看本机是否已经安装jdk。如果已有JDK8以上版本,就不需要再安装了。如下本机已经安装JDK1.7,但最低需要JDK1.8,所以需要重新安装。如果本身没有jdk环境可直接开始安装。删除原JDKrpm -qa | grep java # 删除操作 需要root权限rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.

2020-12-07 15:09:24 209

原创 手写RPC框架之集成spring(基于xml配置文件方式)

Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于 Spring 的 Schema 扩展 进行加载。同样,我们的RPC框架也集成Spring帮助我们更好地实现基于配置的可定制化的加载。自定义标签及解析标签用途<rpc:service/>用于服务提供方配置需要注册的服务<rpc:reference/>用于服务消费方配置引用的服务<r

2020-12-07 15:03:36 375

原创 LeetCode 337 打家劫舍III(中等)

在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3 / \ 2 3 \ \ 3

2020-12-07 10:30:52 139

原创 手写RPC框架之服务注册与发现

从dubbo的服务架构可以看出, Registry主要提供服务的注册与发现功能:即服务的提供方将服务注册在Registry中,而服务的消费方可以从注册的服务里获取提供方的ip地址等信息,从而进行远程过程调用。服务注册中心选型Zookeeper服务存储分层Zookeeper数据存储方式类似于树的组织方式,一个节点下可以有多个子节点。参考上面dubbo中zookeeper的分层方式,在该rpc框架中简化分为root、service和address三层,如下。root层主要就是标识框架的名字,无实.

2020-12-06 19:50:20 344

原创 *LeetCode 312 戳气球(困难)

class Solution { public int maxCoins(int[] nums) { int n = nums.length; int[] new_nums = new int[n+2]; new_nums[0] = 1; new_nums[n+1] = 1; System.arraycopy(nums,0,new_nums,1,n); int[][]

2020-12-06 19:16:38 98

原创 LeetCode 322 零钱兑换(中等)

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1示例 2:输入:coins = [2], amount = 3输出:-1示例 3:输入:coins = [1], amount = 0输出:0示例 4:输入

2020-12-06 19:08:11 78

原创 手写RPC框架之负载均衡

这篇文章一个是记录自己RPC框架中的负载均衡实现,另一个其实更多在于介绍dubbo的负载均衡策略,因为自己实现的负载均衡算法较为简单,也是从dubbo中借鉴而来。代码实现首先还是介绍自己实现的负载均衡。LoadBalance 接口 :@SPI表明可以都可扩展点加载机制来获取@SPIpublic interface LoadBalance { String selectServiceAddress(List<String> serviceAddresses, String rp

2020-12-04 16:29:56 430

原创 *LeetCode 309 最佳买卖股票时机含冷冻期(中等)

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]思路与代码状态机+动态规划参考 leetcode官方题解时间复杂度O(n)

2020-12-04 10:38:42 73

原创 *LeetCode 300 最长上升子序列(中等)

动态规划dp[i] 代表以下标i结尾的最长上升子序列大小(最长子序列必须以nums[i]结尾)。时间复杂度 O(n²)空间复杂度 O(n)class Solution { public int lengthOfLIS(int[] nums) { int[] dp = new int[nums.length]; Arrays.fill(dp, 1); int res = 0; for (int i = 0; i < nums

2020-12-03 11:18:16 57

原创 *LeetCode 301 删除无效的括号(困难)

删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。说明: 输入可能包含了除 ( 和 ) 以外的字符。示例 1:输入: “()())()”输出: ["()()()", “(())()”]示例 2:输入: “(a)())()”输出: ["(a)()()", “(a())()”]示例 3:输入: “)(”输出: [""]思路与代码剪枝回溯时间复杂度 O(2^n)class Solution { int minDel = Integer.MAX_VA

2020-12-03 11:17:51 108

原创 *LeetCode 287 寻找重复数(中等)

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。时间复杂度小于 O(n²) 。-数组中只有一个重复的数字,但它可能不止重复出现一次。思路与代码暴力破解法对于数组中的每一个元素

2020-11-30 10:07:36 72

原创 CentOS7 安装MySQL

下载安装# 导入下载文件cd /usr/local/src/rztar -zxvf mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz # 解压安装包mv mysql-8.0.11-linux-glibc2.12-x86_64 ./mysql8.0 # 移动并重命名# 创建数据存放文件cd /usr/local/mysql8.0/mkdir data创建用户及用户组# 用户组groupadd mysql# 用户 (用户名/密码)user

2020-11-29 21:03:32 84

原创 CentOS7 安装 MongoDB

将MongoDB 安装到 /usr/local下安装步骤1 下载与安装下载安装压缩包找到文件夹 cd /usr/local/src/下载安装包 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz解压安装包tar zxvf mongodb-linux-x86_64-4.0.0.tgz移动并重命名mongodb文件夹mv mongodb-linux-x86_64-4.0.0 ../mongodbcd ..

2020-11-28 14:53:46 87

原创 LeetCode 283 移动零(简单)

class Solution { public void moveZeroes(int[] nums) { int index = 0; int len = nums.length; for (int i = 0; i < len; i++) { if (nums[i] != 0) swap(i, index++, nums); } } public void swap(int a, i.

2020-11-27 11:38:02 51

原创 mysql数据库迁移(linux)

背景需求因业务或磁盘空间需求,需要将mysql数据存储位置进行迁移。数据库:MySQL8服务器:CentOS7具体步骤此步骤为个人尝试,可能会出错,并不完善。查看MySQL数据存放路径cat /etc/my.cnf可以发现数据存放路径为datadir=/var/lib/mysql[root@openmp ~]# cat /etc/my.cnf[cient]port=3306socket=/tmp/mysql.sock[mysqld]port=3306user=mysqls

2020-11-26 14:20:59 748

原创 *LeetCode 279 完全平方数(中等)

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。示例 1:输入: n = 12输出: 3解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.思路与代码动态规划时间复杂度: nnn\sqrt{n}nn​空间复杂度:nnnclass Solution { public int numSquares(int n) {

2020-11-25 11:01:36 61

原创 LeetCode 240 搜索二维矩阵 II(中等)

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回 true。给定

2020-11-25 10:31:40 51

原创 *LeetCode 239 滑动窗口最大值(困难)

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。进阶:你能在线性时间复杂度内解决此题吗?示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1

2020-11-24 13:24:11 96

原创 *LeetCode 238 除自身以外数组的乘积(中等)

给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数

2020-11-23 10:49:53 79

原创 *LeetCode 236 二叉树的最近公共祖先(简单)

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点

2020-11-22 10:45:42 63

原创 LeetCode 234 回文链表(简单)

请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?思路与代码O(n) 时间复杂度不难,主要是 O(1) 空间复杂度,这要求我们不能借助其他的数据结构来存取节点。思路1 找到中间几点2 反转后半部分链表3 判断是否回文/** * Definition for singly-linked list.

2020-11-21 10:52:48 101

原创 NettyServer端的线程处理模型

NettyServer端结合图理解代码// 动态获取当前主机ipString host = InetAddress.getLocalHost().getHostAddress();int port = 8888;NioEventLoopGroup boosGroup = new NioEventLoopGroup(1);NioEventLoopGroup workerGroup = new NioEventLoopGroup(2); // 默认为cpu核数*2 这里手动设置为2Defaul

2020-11-20 17:43:10 331 1

原创 LeetCode 226 翻转二叉树(简单)

翻转一棵二叉树。示例:输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1思路与代码递归// 前序遍历版 从上往下交换class Solution { public TreeNode invertTree(TreeNode root) { if (root == null) return null;

2020-11-20 11:38:14 97

原创 *LeetCode 221 最大正方形(中等)

在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。示例:输入:matrix = [["1","0","1","0","0"], ["1","0","1","1","1"], ["1","1","1","1","1"], ["1","0","0","1","0"]]输出:4思路与代码动态规划dp[i][j]表示以 (i,j)(为右下角,且只包含 '1' 的正方形的边长最大值。核心是dp

2020-11-20 11:19:50 147 1

原创 *LeetCode 215 数组中的第K个最大元素(中等)

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。思路与代码快速排序时间复杂度 O(nlogn)小顶堆时间复杂度 O(nlogk)class Solution { public

2020-11-20 10:58:45 66

原创 大顶堆/小顶堆

小顶堆小顶堆是堆顶元素最小(控制堆中元素个数,比堆顶元素大的元素才能入堆,可以用来确定第k大的数)class MinHeap{ private int capacity; private int count; private int[] elements; public MinHeap(int capacity) { this.capacity = capacity; elements = new int[capacity]; }

2020-11-19 19:32:40 653

原创 *LeetCode 208 实现Trie(前缀树)(中等)

实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。示例:Trie trie = new Trie();trie.insert("apple");trie.search("apple"); // 返回 truetrie.search("app"); // 返回 falsetrie.startsWith("app"); // 返回 truetrie.insert("app"); trie.search("app");

2020-11-17 10:53:57 53

原创 *LeetCode 207 课程表(中等)

class Solution { Map<Integer, List<Integer>> map = new HashMap(); int[] state; public boolean canFinish(int numCourses, int[][] prerequisites) { state = new int[numCourses]; // 0 可以完成的课程 1 搜索中,还不知道可不可以完成的课程 2 还未搜索的课程

2020-11-17 10:19:23 61

原创 服务端监听127.0.0.1 客户端不能通过本机ip访问

Netty-Server 端监听了本地127.0.0.1端口ChannelFuture future = serverBootstrap.bind("127.0.0.1", PORT).sync();Netty-Client 端通过服务注册中心Zookeeper获取的是本地的ip192.168.61.55,通过该地址访问server端,会出现错误Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connect

2020-11-16 15:55:09 2174

原创 LeetCode 206 反转链表(简单)

反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?来源:力扣(LeetCode)思路与代码迭代法/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode nex

2020-11-13 11:07:05 76

原创 LeetCode 200 岛屿数量(中等)

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"]]输出:1示例 2:输入:grid = [ ["1"

2020-11-13 10:44:50 156

原创 LeetCode 198 打家劫舍(简单)

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2,7,9

2020-11-13 10:24:51 49

原创 LeetCode 169 多数元素(简单)

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2思路与代码Boyer-Moore 投票算法如果我们把众数记为 +1,把其他数记为 −1,将它们全部加起来,显然和大于 0,从结果本身我们可以看出众数比其他数多。我们首先给出 Boyer-Moore 算法的详细步骤:

2020-11-13 10:11:39 2153

空空如也

空空如也

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

TA关注的人

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