自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 Docker

Docker中的镜像分层,支持通过现有的镜像,创建新的镜像。类似于Java中的继承,基于一个Base类,按需扩展成想要的类。新镜像是从base镜像一层层叠加生成的,每安装一个软件,就是在现有的镜像基础上加一层。DockerFile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。构建步骤编写DockerFile文件命令构建镜像docker run运行镜像容器实例从应用软件的角度来看,dockerfiledocker镜像docker容器。

2024-08-09 23:45:05 437 1

原创 阿拉伯数字转中文数字

思路把阿拉伯数字转成字符串再反转成list 集合,把反转后的数据遍历,遍历时四个为一组,每一组都是小于一万的数字,在四个一组中的第二个添加单位十,第三个添加单位百,第四个添加单位千,以此类推。当数据遍历到第5个时对应单位万,并添加单位万,第9个时对应单位亿,并添加单位亿,第13位时对应单位万亿,并添加单位万,当遇到零时,如果反转后的数组前一个不为0,则添加零,如果为0则进行下一次循环。代码private static String numberToChinese(Long number) {

2022-04-18 17:55:25 458

原创 中文数字(八百零一)转阿拉伯数字801

思路:一个中文数字无非由(零、一、二、三、四、五、六、七、八、九、十、百、千、万、亿)组成,(不考虑更大数量级)。按数字类型分:① 特殊数字: 零② 基本数字: 一、二、三、四、五、六、七、八、九③ 单位: 十、百、千、万、亿比如:八亿三千万零四百九十三(830000493)结论: 基本数字后面一定是单位,所以,以基本数字和其后的单位为一个基本单位,数字和单位相乘的结果相加,即是对应的阿拉伯数字定义两个Map public static long ChineseToNumber(St

2022-03-11 16:31:58 695

原创 Gateway 整合 swagger 踩坑

一、导入依赖注意版本问题,这里的swagger-bootstrap-ui依赖版本使用1.8.9不要使用1.9.6,不然不会加载 /swagger-resource <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2

2021-09-22 11:51:20 1984 2

原创 Nacos + gateway 踩坑——加负载均衡依赖

spring cloud alibaba + Nacos + gateway 踩坑一定要加上负载均衡依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency>版本

2021-09-16 16:42:22 1059 1

原创 No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc

> No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer由于SpringCloud Feign在 Hoxton.M2 RELEASED版本之后不再使用Ribbon而是使用spring-cloud-loadbalancer,所以不引入spring-cloud-loadbalancer会报错,解决方法 加入spring-cloud-loadb.

2021-07-22 23:47:45 1051 1

原创 多模块项目依赖问题——工具包install失败或者父级模块install失败

Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.5.2:repackage (repackage)程序包com.monster.common.utils不存在Execution repackage of goal org.springframework.boot:spring-boot-maven-plugin:2.5.2:repackage failedcommon 模块中插件的配置<

2021-07-22 22:23:02 641

原创 KMP算法(字符串匹配问题)

一、暴力匹配package com.monster.kmp;/** * @author Monster * @version v1.0 * @time 05-09-2021 14:06:06 * @description: */public class ViolenceMatch { public static void main(String[] args) { String str1 = "我爱你我我我爱我爱你啊天安门我我爱我爱爱你我我爱你啊天安门";

2021-05-09 15:55:32 90

原创 动态规划算法

动态规划算法介绍动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若千个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)动态规划可以通过填表的方式来逐步推进,得到最优解.背包问题,将三件商品.

2021-05-09 13:56:48 106

原创 分治算法(汉诺塔)

分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……分治法在每一层递归上都有三个步骤:1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题3)合并:将各个子问.

2021-05-07 21:54:19 110

原创 二分查找算法

二分查找算法有两种解决方式,递归和非递归,很简单,直接看代码package com.monster.binarysearch;/** * @author Monster * @version v1.0 * @time 05-07-2021 20:55:54 * @description: */public class NoRecur { public static void main(String[] args) { int[] arr = {1, 3, 5, 6,

2021-05-07 21:33:29 94

原创 设计模式——七大原则

设计模式的目的编程过程中,程序员面临着来自耦合性、内聚型以及可维护性、可扩展性、重用性、灵活性等多方面的挑战,设计模式是为了让程序具有更好的代码复用性、可读性、可靠性、可扩展性以及使代码呈现高内聚、低耦合的特性。一、单一职责原则对类来说,即一个类只负责一项职责。如果一个类负责两个不同的职责,当其中一个职责发生改变时,可能造成另外一个职责的执行错误,所以我们要将这个类粒度分解为两个类,分别负责对应的职责。注意事项和细节降低类的复杂度,一个类只负责一项职责提高代码的可读性、可维护性降低代

2021-04-18 16:24:41 143

原创 平衡二叉树(AVL)

package com.monster.AVL;/** * @author Monster * @version v1.0 * @time 04-17-2021 11:12:49 * @description: */public class AVLTreeDemo { public static void main(String[] args) { //int[] arr = {4, 3, 6, 5, 7, 8}; //int[] arr = {10.

2021-04-17 15:36:55 59

原创 二叉顺序树(BST)

package com.monster.BST;/** * @author Monster * @version v1.0 * @time 04-16-2021 16:26:38 * @description: */public class BinarySortTreeDemo { public static void main(String[] args) { BinarySortTree bst = new BinarySortTree(); .

2021-04-16 21:16:32 76

原创 赫夫曼编码的压缩和解压文件

package com.monster.huffmancode;import java.io.*;import java.util.*;/** * @author Monster * @version v1.0 * @time 04-15-2021 18:50:57 * @description: 赫夫曼编码 */public class HuffmanCode { public static void main(String[] args) { /*Stri

2021-04-16 13:27:41 108

原创 赫夫曼树

package com.monster.huffmantree;import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * @author Monster * @version v1.0 * @time 04-14-2021 22:46:01 * @description: 赫夫曼树 */public class HuffmanTree { public static.

2021-04-15 18:36:28 64

原创 排序算法八:堆排序

package com.monster.sort;import java.util.Arrays;/** * @author Monster * @version v1.0 * @time 04-14-2021 21:11:54 * @description: 堆排序, 大顶堆--> 升序, 小顶堆--> 降序 */public class HeapSort { public static void main(String[] args) { int

2021-04-15 18:35:24 68

原创 代码生成器

根据数据库表,生成相应的entity、mapper、service、controller等java类代码:把代码写在测试类中运行即可package com.monster;import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.generator.AutoGenerator;

2021-04-02 21:27:57 205

原创 浅谈线程池ThreadPoolExecutor

一、线程池的三种创建方式线程池的继承体系从结构图中可以看到,Executors是ThreadPoolExecutor的一个工具类,所以我们创建线程池一般使用Executors1、创建指定数量的线程池ExecutorService threadPool = Executors.newFixedThreadPool(5);2、创建只有一个线程的线程池ExecutorService threadPool = Executors.newSingleThreadExecutor();3、创

2021-03-31 22:29:51 102

原创 请举例说明集合类是不安全的,面试加分项:你在开发中遇到过哪些问题、遇到过哪些异常?

请举例说明集合类是不安全的,面试加分项:你在开发中遇到过哪些问题、遇到过哪些异常?异常对象: java.util.ConcurrentModificationException并发修改异常异常情况:每次出现错误的情况都不一样,在程序运行正常的情况下,有时空值,有时有值,有时还会报异常导致原因:ArrayList集合是线程不安全的,又要读数据,又要写数据解决方案:方法一:使用Vector代替ArrayList,因为Vector是线程安全的。方法二:把一个线程不安全的转化成线程安

2021-03-29 23:37:10 151 3

原创 多线程八锁详细分析 + 个人理解

线程八锁:1、标准访问,请问先执行发邮件还是先发短信?2、如果让发邮件sleep()三秒钟是先发邮件还是先发短信?3、新增一个普通方法hello(),先发邮件还是先执行hello()?4、两部手机(两个资源类对象),先发邮件还是先发送短信?5、两个静态方法,同一部手机,先发邮件还是先发短信?6、两个静态方法,两部手机,先发邮件还是先发短信?7、一个普通方法,一个静态方法,一部手机,先发邮件还是先发短信?8、一个普通方法,一个静态方法,两部手机,先发邮件还是先发短信?这里我认为需要加一些前提

2021-03-29 22:37:06 216

原创 Spring Security 自定义登录页面

只需要在配置类中继承WebSecurityConfigurerAdapter类,重写configure方法即可.loginPage(“login.html”) // 登录页面设置.loginProcessingUrl("/user/login") // 登录页面的访问路径.defaultSuccessUrl("/index") // 权限认证成功(登录成功)后跳转的页面 .and().authorizeRequests() .antMatchers("/",

2021-03-25 17:26:40 117

原创 Spring Security实现从数据库中访问用户名和密码实现登录

1、相关依赖这里不做代码演示,本案例使用的是mybatis-plus框架操作数据库2、实体类创建一个实体类,建议尽量别用User作为实体类的类名,和org.springframework.security.core.userdetails.User冲突,容易导错包,但本例中使用User做为实体类,给想用User的小伙伴做个演示。(使用这种方式导包时,导入的都是自定义实体类User包,只有在最后将数据保存到org.springframework.security.core.userdetails.

2021-03-25 17:06:57 1386

原创 Spring Security 自定义用户名和密码的三种方式

默认方式:当我们没有自定义用户名和密码而使用到了Spring Security这个框架时,会默认的为我们生成一个同户名和密码:用户名为user,密码在Spring启动时的日志里面找方式一:在配置文件中配置你可以在application.properties中配置用户名和密码,也可以在application.yml中进行配置,推荐使用application.yml,这里使用application.properties,但所做的配置相同spring.security.user.name=mons

2021-03-25 14:55:53 1914

原创 SpringBoot中REST风格的使用注意事项

什么是REST风格:REST即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAP和XML-RPC对比来讲明显的更加简洁,越来越多的web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格

2021-03-24 18:37:14 231

原创 二叉树的前序、中序、后序遍历

思路分析:前序遍历:先输出根节点本身,然后再递归输出左节点和右节点中序遍历:先递归输出左节点,再输出根节点,最后递归输出右节点后序遍历:先递归输出左右节点,再输出根节点代码演示:package com.monster.tree;/** * @author Monster * @version v1.0 * @time 03-22-2021 08:21:09 * @description: 二叉树的前序、中序、后序遍历 */public class BinaryTreeDemo

2021-03-22 08:54:12 53

原创 查找算法四:斐波那契排序(黄金分割法)

原理:注意:要求数组必须有序代码演示及算法思路:package com.monster.search;import java.util.Arrays;/** * @author Monster * @version v1.0 * @time 03-20-2021 12:11:16 * @description: 斐波那契查找算法(黄金分割法):根据斐波那契数列后面一个数等于前面两个数的和把数组分割成两部分 */public class FibonacciSearch {

2021-03-20 13:44:22 682

原创 查找算法三:插值查找

思路分析:插值查找算法是在二分查找算法上的改进,同样要求待查找的数组是有序的,这里需要把把中间值从 int mid = (left + right) / 2;变成 int mid = left + (right - left) * (value - arr[left]) / (arr[right] - arr[left]); 即可,大大降低了查找的次数。这里需要注意,需要加上value < arr[left]|| value > arr[right]这个判断条件,防止value的值过大,而产

2021-03-20 10:26:46 85

原创 查找算法一、二:线性查找、二分查找

一、线性查找:思路分析:直接遍历数组,查找和要查找的元素相等的元素的索引,如果相等,则返回该索引,如果没找到,则返回-1;如果可能存在多个的索引时,则可以把每一个索引放入List集合中,返回List集合即可代码演示:只找一个索引的情况: public static int lineSearch(int[] arr, int value) { for (int i = 0; i < arr.length; i++) { if (value

2021-03-19 23:39:25 152

原创 排序算法七:基数排序

思路分析:遍历需要排序的数组,得到数组中的每一个元素,第一轮:将每一个元素 % 10 得到个位上的值,按照个位值得不同放入对应的桶中,全部放入后,再从第一个桶中依次取出所有的元素放入原始数组中,再取第二个桶中的元素…,以此类推,取得所有元素。第二轮:再/ 10 % 10得到十位上的值,放入相应的桶中,再依次取出…有几轮由最大数的长度决定最后得到的就是完成排序的数组代码思路:将数组中的数据分成10组,即放在10个桶中,将这10个桶用一个数组int[][] bucket = new in

2021-03-19 16:31:05 104

原创 排序算法六:归并排序

思路分析:把要排序的数组按照中值进行分割成两份,再把每一份分割成两份,直到每一份只有一个元素就不再分割,递归返回,把这返回的两份元素按照大小顺序加入到临时数组temp中,最后再把temp中的数据拷贝到原数组的原位置上,递归即可代码展示:package com.monster.sort;import java.util.Arrays;/** * @author Monster * @version v1.0 * @time 03-19-2021 09:51:21 * @desc

2021-03-19 10:44:10 109

原创 排序算法五:快速排序

思路分析:取数组最中间的那个数为基数(取哪一个数为基数都可以,取中间的只是为了好理解),在左边找一个比基数大的数,在右边找一个比基数小的数,如果找到就交换两个数的位置,交换过后再向下寻找,直到左边的角标大于等于右边则退出,一轮排序后,基数的左边一定都是比基数小的,基数的右边一定是比基数大的,(注意:基数不一定还在原来的位置,可能出现在基数左边找不到比基数大的数,故而左边找到的数只能是基数本身,而右边找到的数小于基数,此时,仍会发生交换,交换过后,右边的数就是基数本身,然后左边的角标+1,再比较左边的数是

2021-03-19 08:43:12 75

原创 排序算法四:希尔排序

思路分析:假设一个数组的长度为10,先将这个数组分为 10/2 = 5组,每组有 2 个数据,每组中的每个数的角标相差5,如果这些组中的数据第一个比第二个大,则交换两个数据的位置再将这个数组分为 5/2 = 2组,每组有5个数据,每组中的每个数的角标相差2,将这5个数据按照从小到大排序再将这个数组分为 2/1 = 1 组,进行排序,得到的数组即为排序后的数组希尔排序分为两种:交换式希尔排序和移位式希尔排序一:交换式希尔排序:这种交换式希尔排序,在每一个组中,每相邻两个元素都需要进行比较,相

2021-03-18 21:08:18 79

原创 排序算法三:插入排序

思路分析:从数组的第二个位置开始,记录当前要进行插入的元素值为insertValue,此元素的前一个位置的索引为insertIndex,把insertValue与前面的一个元素相比较,如果大于前面的元素,则直接在此位置插入,如果小于前面位置上的元素,则把前面位置上的元素后移,即arr[insertIndx + 1] = arr[insertIndex],索引insertIndex–1,再进行下一次判断,直到找到可以插入的位置,这里要注意角标越界问题代码展示:package com.monster.so

2021-03-18 17:07:27 57

原创 排序算法二:选择排序

思路分析:遍历数组,将当前元素的索引记为minIndex,将当前元素的值记为min,判断以后的每一个元素是否小于min,如果小于,则把这个数赋值给min,索引赋值给minIndex,循环一次后,交换两个元素的值package com.monster.sort;import java.util.Arrays;/** * @author Monster * @version v1.0 * @time 03-18-2021 14:47:04 * @description: */public

2021-03-18 16:45:31 58

原创 排序算法一:冒泡排序

冒泡排序思路分析:把数组中相邻的两个数进行比较,如果前面的数比后面的数大,则交换两个数的位置,一轮排序之后,最大的数就会在最后面,而第二次排序只需排序前(n-1)个数据即可,这里需要注意角标越界问题public class BubbleSort { public static void main(String[] args) { int[] arr = {8, 4, 1, -1, 0, 9, 3, 5}; int temp; // 时间复杂

2021-03-18 12:39:21 79

原创 八皇后问题

思路分析代码实现package com.monster.digui;import org.junit.Test;/** * @author Monster * @version v1.0 * @time 03-17-2021 13:50:09 * @description: 八皇后问题 */public class Queue { int max = 8; int[] queues = new int[max]; int count = 0;.

2021-03-17 15:13:44 73

原创 中缀表达式转后缀表达式---简化版(支持括号、多位数)

步骤1)初始化两个栈:运算符栈s1和储存中间结果的栈s2;2)从左至右扫描中缀表达式;3)遇到操作数时,将其压s2;4)遇到运算符时,比较其与s1栈顶运算符的优先级:1.如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;2.否则,若优先级比栈顶运算符的高,也将运算符压入 s1;3.否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的 栈顶运算符相比较;5)遇到括号时:(5)如果是左括号“(”,则直接压入s1(6)如果是右括号“)”,则依次弹出s1栈顶的

2021-03-17 09:41:27 225

原创 用栈的方式实现逆波兰表达式的计算

逆波兰表达式计算器,后缀表达式*中缀表达式:(3+7)9-2前缀表达式:- * + 3 7 9 2后缀表达式:3 7 + 9 * 2 -一般情况下,我们会把中缀表达式或前缀表达式转换成后缀表达式进行计算用栈的方式实现逆波兰表达式的计算package com.monster.stack;import sun.applet.Main;import java.util.ArrayList;import java.util.List;import java.util.Stack;/**

2021-03-16 16:36:01 98

原创 栈模拟计算器,带括号,栈方式实现-----中缀表达式

支持两位以上的运算,可带多个括号,栈package com.monster.stack;import java.util.Stack;/** * @author Monster * @version v1.0 * @time 03-16-2021 10:26:38 * @description: 支持两位以上的运算,可带多个括号,栈 */public class Calculator2 { public static void main(String[] args) {

2021-03-16 15:30:49 113

空空如也

空空如也

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

TA关注的人

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