自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Lucius

请多指教

  • 博客(84)
  • 资源 (1)
  • 收藏
  • 关注

原创 缓存中的问题

一致性问题缓存和数据库一致性问题,存储的数据随着时间可能会发生变化,而缓存中的数据就会不一致。具体能容忍的不一致时间,需要具体业务具体分析,但是通常的业务,都需要做到最终一致性。一致性分类强一致性强一致性可以理解为在任意时刻,所有节点中的数据是一样的。同一时间点,你在节点A中获取到key1的值与在节点B中获取到key1的值应该都是一样的。弱一致性弱一致性包含很多种不同的实现,分布式系统中广泛实现的是最终一致性。最终一致性所谓最终一致性,是弱一致性的一种特例,保证用户最终能够读取到某操作对系统

2021-07-20 17:26:20 499

原创 简单聊缓存

在服务端编程当中,缓存主要是指将数据库的数据加载到内存中,之后对该数据的访问都在内存中完成,从而减少了对数据库的访问,解决了高并发场景中数据库容易成为性能瓶颈的问题;以及基于内存的访问速度高于磁盘的访问速度的原理(数据库读取数据一般需要从磁盘读取),提高了数据的访问速度和程序性能。根据缓存是否与应用进程属于同一进程,可以将内存分为本地缓存和分布式缓存。本地缓存是在同一个进程内的内存空间中缓存数据,数据读写都是在同一个进程内完成;分布式缓存是一个独立部署的进程并且一般都是与应用进程部署在不同的机器,故需

2021-07-20 17:06:59 198

原创 Java-笔试输入输出记录

春招开始了,希望能有个好的结果,很久没有提笔写博客了,那就从输入输出开始吧!/**1.数组求和 一直输入* 1 510 20** 6 30* */import java.util.*;public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int

2021-03-08 20:51:17 539

原创 回溯算法的套路/BFS/DFS

回溯算法框架result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表) 撤销选择全排列问题返回一个数组元素的全排列力扣:46. 全排列List<List<Integer>> res = new LinkedList&l

2020-09-11 21:38:11 250

原创 二叉树和二叉搜索树(BST)的秒杀方法

二叉树回溯算法框架void method(TreeNode root) { // root 需要做什么?在这做。 // 其他的不用 root 操心,抛给框架 method(root.left); method(root.right);}来看看这个框架能够秒杀哪些类型的题目二叉树的镜像void mirror(TreeNode root) { // root 需要做什么?左右互换 // 其他的不用 root 操心,抛给框架 if(root=

2020-09-10 14:23:57 152

原创 二分查找的前前后后

最普通的二分查找(无重复元素的有序数列)int binary_search(int[] nums, int target) { int left = 0, right = nums.length - 1; while(left <= right) { int mid = left + (right - left) / 2; if (nums[mid] < target) { left = mid + 1;

2020-09-09 10:45:14 136

原创 Java中的多态问题

多态的总结1、使用父类类型的引用指向子类的对象;2、该引用只能调用父类中定义的方法和变量;3、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)4、变量不能被重写(覆盖),“重写”的概念只针对方法,如果在子类中“重写”了父类中的变量,那么在编译时会报错。通俗理解:  父类类型的引用指向子类的对象。父类只能调用自己的方法,但是如果自己的方法被子类覆盖了,那么调用的就是子类的,这种情况就是动态连接。如果这个方法是子类独有的,那么父类类型的引用

2020-09-07 15:36:03 259

原创 Java子类实例化总是默认调用父类的无参构造方法

子类实例化时,默认调用父类的无参构造方法(不管子类的构造器有没有参数,因为子类继承的是父类的属性和方法,只调用父类的无参构造器就可以继承父类的属性和方法,因此不会调用父类的有参构造器),再调用子类的有参/无参构造器。示例:class Father { public Father(){ System.out.println("父类的无参构造方法"); } public Father(int a ) { System.err.println("父类的有参构造方法"+a); } }

2020-09-06 21:15:12 2673 1

原创 建造者模式

模式的定义与特点  建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。 该模式的主要优点如下:各个具体的建造者相互独立,有利于系统的扩展。客户端不必知道产品内部组成的细节,便于控制细节风险。 其缺点如下:产品的组成部分必须相同,这限制了其使用范围。如果产品的内部

2020-09-06 19:57:31 79

原创 抽象工厂模式

模式的定义与特点  抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。  使用抽象工厂模式一般要满足以下条件:系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。系统一次只可能消费其中某一族产品,即同族的产品一起使用。  抽象工厂模式除了具有

2020-09-06 14:48:25 118 2

原创 工厂方法模式

模式的定义与特点  工厂方法(FactoryMethod)模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。  我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背“开闭原则”。  本节介绍的“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以

2020-09-05 16:28:20 109

原创 单例(Singleton)模式

文章目录单例模式的定义和特点单例模式的结构饿汉式单例懒汉式单例静态内部类单例枚举类单例单例模式的定义和特点定义:一个类只有一个实例,且该类能够自行创建这个实例的一种模式。特点:单例类只有一个实例对象该单例对象必须由单例类自行创建单例类对外提供一个访问该单例的全局访问点单例模式的结构单例模式的主要角色包含以下两个部分:单例类:包含一个实例且能够自行创建这个实例的类访问类:使用单例的类饿汉式单例特点:类一旦加载就创建一个单例,保证在调用getInstance()方法之前单例就已

2020-09-04 14:47:17 137

原创 设计模式的基本概念

文章目录GoF 的 23 种设计模式设计模式的分类各种设计模式的功能面向对象OOP的七大设计原则开闭原则定义作用实现方法里氏替换原则定义作用依赖倒置原则定义作用实现方法单一职责原则定义作用接口隔离原则定义作用实现方法与单一原则的区别迪米特原则定义作用实现方法合成复用原则定义作用GoF 的 23 种设计模式设计模式的分类根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。这样可以降

2020-09-03 20:23:54 254

原创 链表/队列/栈/集合/Map/树/堆

文章目录Java集合框架层次结构数组链表栈队列集合HashSetLinkedHashSetTreeSetMapHashMapLinkedHashMapTreeMapHashTableHashTable与HashMap的区别树二叉树满二叉树和完全二叉树:二叉查找树(BST)平衡二叉树AVL树红黑树AVL树和红黑树的区别B树和B+树B树(B-树)B+树堆大顶堆小顶堆Java集合框架层次结构首先给出Java集合框架的基本接口/类层次结构:java.util.Collection [I] +--jav

2020-08-08 16:52:30 653

原创 SpringCloud 基础概念

微服务  微服务架构是一种以一些微服务来替代开发单个大而全应用的方法,每一个小服务运行在自己的进程里,并以轻量级的机制来通信, 通常是 HTTP RESTful API。微服务强调小快灵, 任何一个相对独立的功能服务不再是一个模块, 而是一个独立的服务。微服务的特性微服务的好处目前微服务的发展状况SpringCloud服务发现——Netflix Eureka对比Dubbo客服端负载均衡——Netflix RibbonFeign对比ZooKeeper断路器——Netflix Hystr

2020-07-17 21:43:39 287

原创 剑指 Offer —礼物的最大价值

复仇Bytedance之路 题目描述:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物提示:0 < grid.length &l.

2020-07-08 20:49:16 131

原创 剑指Offer —顺时针打印矩阵

复仇Bytedance之路 题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 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 <= ma.

2020-07-07 21:50:57 94

原创 剑指 Offer — 从上到下打印二叉树

复仇Bytedance之路 题目描述:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回:[3,9,20,15,7]提示:节点总数 <= 1000题解典型的程序遍历即广度优先搜索(BFS)。BFS 是借助队列的先入先出特性实现的:算法流程:特例处理: 当树的根节点为空,则直接返回空列表 [] ;初始.

2020-07-04 22:30:10 431

原创 剑指 Offer — 平衡二叉树

复仇Bytedance之路 题目描述:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3.

2020-07-04 16:48:55 3079

原创 剑指 Offer —对称的二叉树

复仇Bytedance之路 题目描述:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [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]输出.

2020-07-04 15:01:11 123

原创 全排列-DFS

复仇Bytedance之路 题目描述:给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]题解其实像这种类型的题目有很多,因此dfs是一种必须要掌握的方法DFS视频讲解深度优先搜索class Solution { public List<List<Integer>> perm.

2020-07-03 21:03:22 95

原创 剑指 Offer —数组中出现次数超过一半的数字

复仇Bytedance之路 题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2限制:1 <= 数组长度 <= 50000题解摩尔投票法:票数和: 由于众数出现的次数超过数组长度的一半;若记 众数 的票数为 +1,非众数 的票数为 -1 ,则一定有所有数字的 票数和 > 0 。票数正负抵消: 设数组.

2020-06-28 20:27:10 157

原创 常见排序算法总结—Java实现

0. 总结表格相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。(不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。1. 冒泡排序(Bubble Sort)  冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作

2020-06-28 14:10:40 531

原创 剑指 Offer —合并两个排序的链表

复仇Bytedance之路 题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4限制:0 <= 链表长度 <= 1000题解创建一个虚拟头节点,比较两个链表的头节点。/** * Definition for singly-linked list. * public class ListNode .

2020-06-27 22:34:22 109

原创 剑指 Offer —最长不含重复字符的子字符串

复仇Bytedance之路 题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案.

2020-06-27 15:51:50 100

原创 剑指 Offer —数值的整数次方

复仇Bytedance之路 题目描述:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25说明:-100.0 <.

2020-06-24 15:20:17 96

原创 剑指 Offer — 剪绳子

复仇Bytedance之路 题目描述:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m] 。请问 k[0]k[1]…*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入: 2输出: 1解释: 2 .

2020-06-24 15:00:42 94

原创 剑指 Offer — 矩阵中的路径

复仇Bytedance之路 题目描述:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[["a","b","c","e"],["s","f","c","s"],["a","d","e","e"]]但矩阵中不包含字符串“abfb”的路径,因.

2020-06-23 21:43:17 97 1

原创 剑指 Offer —斐波那契数列/青蛙跳台阶问题

复仇Bytedance之路 题目描述:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:1示例 2:输.

2020-06-22 21:03:49 146

原创 剑指 Offer —用两个栈实现队列

复仇Bytedance之路 题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:["CQueue","del.

2020-06-22 20:26:36 123

原创 剑指 Offer — 从尾到头打印链表/链表反转

复仇Bytedance之路 题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1] 限制:0 <= 链表长度 <= 10000题解方法一:反转链表之后输出遍历结束之后:cur==null; pre是尾节点/** * Definition for singly-linked list. * public class ListNode { * int val; *.

2020-06-21 20:49:47 80

原创 剑指 Offer — 替换空格

复仇Bytedance之路 题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are%20happy."限制:0 <= s 的长度 <= 10000题解这种就没意思了s.replace(" ","%20");那就直接stringbuilder吧class Solution { public String replaceSpace(String s) { .

2020-06-21 18:59:55 93

原创 剑指 Offer —二维数组中的查找

复仇Bytedance之路 题目描述:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 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].

2020-06-21 18:43:21 95

原创 Redis-底层数据结构解析

1. 常用的五种数据类型数据类型结构存储的值常用命令使用场景String可以是字符串或数字GET/SET/DEL存储 json 字符串;主键自增Hash包含键值对的无序散列表HSET/HGET/HDEL存储对象类数据,如个人信息。相比string更加灵活List一个可进行头尾增删的双向链表RPUSH/RPOP/LRANGE/RINDEX消息队列;最新内容Set无序字符串SADD/SMENBERS/SISMEMBER共同好友:取交集Zs

2020-06-21 14:24:27 219

原创 剑指 Offer—找出数组中重复的数字

题目描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 限制:2 <= n <= 100000解题思路:方法一:遍历数组元素放到set/map,中判断是否已经有了,有了就返回。时间复杂度O(n)class Solution { public int

2020-06-20 21:50:07 205

原创 Dockrer-01-安装与简单使用

环境:阿里云Centos7Docker安装官方文档00-先清空之前的版本  如果首次安装则请直接下一步$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-lates

2020-06-08 20:26:39 220

原创 SpringBoot商城秒杀系统-04-项目总结

秒杀项目源码项目的亮点:使用分布式Seesion,可以实现让多台服务器同时可以响应。使用redis做缓存提高访问速度和并发量,减少数据库压力,利用内存标记减少redis的访问。使用消息队列完成异步下单,提升用户体验,削峰和降流。安全性优化:shiro安全框架,数学公式验证码,接口限流防刷。页面缓存,加快用户访问速度开发技术前端技术 :Bootstrap + jQuery + Thymeleaf后端技术 :SpringBoot 2.0+ MyBatis + MySQL中间件技术 : D

2020-06-04 15:20:15 461

原创 SpringBoot商城秒杀系统-03-整合RabbitMQ进行异步下单

RabbitMQ安装配置环境说明:Centos7  由于 RabbitMQ 使用通过 Erlang 来开发的,因此需要提前安装Erlang。Erlang 和 RabbitMQ 的对应关系:官网。一定要注意版本配合否则有误。安装Erlangyum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-develwget https://packages.erlang-solutions.com/erlang-soluti

2020-06-04 14:35:36 548

原创 SpringBoot商城秒杀系统-02-用户/商品/页面缓存

基本概念页面优化技术页面缓存+URL缓存+对象缓存由于并发瓶颈在数据库,想办法如何减少对数据库的访问,所以加若干缓存来提高,通过各种粒度的缓存,最大粒度页面缓存到最小粒度的对象级缓存。页面静态化,前后端分离都是纯的html,通过js或者ajax来请求服务器,如果做了静态化,浏览器可以把html缓存在客户端。静态资源优化JS/CSS压缩,减少流量。(压缩版的js,去掉多余的空格字符。区别于阅读版)JS/CSS组合,减少连接数。(将多个JS和CSS的组合到一个请求里面去,一下子从服务端全部下载

2020-06-01 19:00:01 183

原创 SpringBoot商城秒杀系统-01-分布式session

1. 什么是session?会话技术简介  http协议是无状态的,因此对于服务端来说,当它接收到客户端的http请求时,无法识别这个请求来源于哪个客户端。无状态的协议有优点也有缺点,但对于需要识别客户端甚至是需要记住客户端的业务来说,应当要让http协议"有状态"。  需要记住客户端的业务种类非常多。例如登陆系统,在一个页面登录后,新打开一个该网站页面,应当也保持登录状态。再例如购物车系统,某用户添加商品1后应当保证他还能继续添加商品2,在结算时能够读取购物车中的所有商品。  如何让服务端记住客户

2020-05-29 20:21:39 265

《机器学习实战》源码+用到的文件

《机器学习实战》源码+用到的文件,全高清PDF有目录。。。

2018-11-05

空空如也

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

TA关注的人

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