自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 基于ReflectASM+注解开发对象转换工具

在项目对接数据中,会遇到了对外标准和内部标准对象转换问题,需要将上报的数据对象转换为我们项目中标准数据对象,当两边数据标准一致时,比较常见的方式,就是一个标准的对象,和对接数据;或者复制对象。第一种方法,就会有长篇幅的和方法代码出现,代码不够简洁;也容易遗漏字段的赋值,代码简洁,一行代码就可以实现对象的转换。而当标准不一致时题,比如在对接文档中,性别字段为 ,而在我们标准中字段却为,对于这种问题,还是只能回到第一种方法,在代码中和,除了这两种情况外,还有上报数据类型和我们标准的类型不一致、上报数据格式为字符

2022-05-31 22:26:36 426 3

原创 项目工具:使用PYTHON实现一个SSH隧道界面

开发原因MobaXterm作为一个全能型终端神器,功能十分强大,我经常使用其中隧道功能,使用内部无法直接服务器,查询数据,一般来说,一个本地端口对于一个隧道,但是MobaXterm,免费版本最多只能建立三个隧道,比如,我需要一次查询统计,就会用到四个隧道的操作,就非常不方便,需要调整一个隧道,于是,便用python写了多隧道的客户端效果图界面使用tkinter实现,左边是输入隧道的信息,右边为历史列表,源码分析构建隧道def operate_sshtunnel(tunnel_info):

2022-02-07 16:05:10 2202

原创 项目工具:两行代码快速生成测试的数据的FakeDataMaker

开发原因ReflectASM 是一个非常小的 Java 类库,通过代码生成来提供高性能的反射处理,自动为 get/set 字段提供访问类,访问类使用字节码操作而不是 Java 的反射技术,因此非常快。在单元测试的时,需要模拟制造一些数据去测试我们代码会不会出现明显的异常(字段导致、空指针),除了自己乱编写一些测试数据以外,也会实用javafaker进行“真实数据”模拟,当然可以减少我们的代码量。如果,只是前期的简单测试,对数据的正确性并不高,使用javafaker对每个字段都进行编造,代码量还是不少

2021-10-11 00:14:36 6994

原创 项目工具:使用freemarker实现业务代码生成器

开发原因之前使用的开源框架里面,有个代码生成器,可以一键生成的重复业务代码(包括:controller、service、mapper、entity),虽然很好用,但是生成器属于框架定制化开发工具,要是其他项目要是想使用这个生成器,需要同时启动前后端的服务,在页面上配置表和导出的路径,这样操作就非常的不方便,需要参考了这块的逻辑,结合自己需求,基于freemarker开发了一个简单业务代码生成器Apache FreeMarker 是一个模板引擎:一个基于模板和变化数据生成文本输出(HTML网页、电子邮件

2021-08-02 00:42:37 806

原创 功能设计:设计一个数据同步的方案(p6spy+注解+AOP)

这个方案只完成了一个简单的demo,估计完成了80%后,由于方案的修改,这个部分功能也就作废了,打算写篇文章记录一下,大致的思路用到的两个知识点:P6Spy是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架。 通过P6Spy我们可以对SQL语句进行拦截,相当于一个SQL语句的记录器,这样我们可以用它来作相关的分析Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc

2021-07-02 00:08:54 626 1

原创 每日题解:LeetCode 897. 递增顺序搜索树

题目地址题目描述给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u31xCcBU-1619365061635)(1)]示例 1:输入:root = [5,3,6,2,4,null,8,1,null,null,null,7,9]输出:[1,null,2,null,3,null,4,null,5,null,6,null,

2021-04-25 23:37:59 112

原创 每日题解:LeetCode 208. 实现 Trie (前缀树)

题目地址题目描述Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean s

2021-04-14 22:51:39 129

原创 每日题解:LeetCode 783. 二叉搜索树节点最小距离

题目地址题目描述给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。注意:本题与 530:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/ 相同示例 1:输入:root = [4,2,6,1,3]输出:1示例 2:输入:root = [1,0,48,null,null,12,49]输出:1解法javaclass Solution { int pre;

2021-04-13 23:27:40 111

原创 每日题解:LeetCode 179. 最大数

题目地址题目描述给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。示例 1:输入:nums = [10,2]输出:"210"示例 2:输入:nums = [3,30,34,5,9]输出:"9534330"示例 3:输入:nums = [1]输出:"1"示例 4:输入:nums = [10]输出:"10"解法class Solution { publi

2021-04-12 22:39:56 172

原创 每日题解:LeetCode 264. 丑数 II

题目地址题目描述给你一个整数 n ,请你找出并返回第 n 个 丑数 。丑数 就是只包含质因数 2、3 和/或 5 的正整数。示例 1:输入:n = 10输出:12解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。示例 2:输入:n = 1输出:1解释:1 通常被视为丑数。解法class Solution { public int nthUglyNumber(int n) { int [] dp= new

2021-04-11 22:16:22 92

原创 每日题解:LeetCode 33. 搜索旋转排序数组

[题目地址]https://leetcode-cn.com/problems/search-in-rotated-sorted-array/题目描述已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0], a[1], a[2], …, a[n-1]

2021-04-10 23:47:33 119

原创 功能设计:如何实现一个扫码上传附件的功能

授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。需求背景虽然,我们项目客户大部分为pc端操作,当客户要把手机拍中照片,要上传至系统中,如果APP没有提供专门的接口,客户需要先把照片传到电脑中,然后通过网页上传,这样比较麻烦,于是,产品便提出需要开发扫码.

2021-03-21 21:04:44 2597

原创 每日题解:LeetCode 45. 螺旋矩阵

题目地址题目描述给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hPDkehR9-1615821187527)(https://www.kura.ren/upload/2021/03/spiral1-0e7d505e4e4c4aabb76e01969f7c4a08.jpg)]示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2

2021-03-15 23:14:20 163

原创 项目工具:线上“假死“问题解决(Jstack工具分析,脚本监控服务)

问题项目在正式上线后,偶发性出现项目的"假死"的问题,项目无法响应前端的请求,一开始,架构师查询到存在大量锁表的情况,去掉了一些长时间任务的更新的事务,同时提高了JVM的-Xmx和-Xms的大小,第一天虽然情况有所缓解,在第二天访问量上去后,还是出现了假死的问题。于是,在顶着客户在抱怨的情况下,我使用Jstack保存了当时的堆信息,分析当时项目的线程情况。jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息

2021-03-01 23:35:52 624

原创 项目重构:一行代码的背后-设计模式(模板方法+管道模式)

管道-过滤器模式的体系结构是面向数据流的软件体系结构。它最典型的应用是在编译系统。一个普通的编译系统包括词法分析器,语法分析器,语义分析与中间代码生成器,优化器,目标代码生成器等一系列对源程序进行处理的过程。人们可以将编译系统看作一系列过滤器的连接体,按照管道-过滤器的体系结构进行设计。此外,这种体系结构在其它一些领域也有广泛的应用。因此它成为软件工程和软件开发中的一个突出的研究领域。简单点的说,管道模式,整个控制的结构类似一个单链表,上个步骤将数据处理后,传递到下一个步骤进行处理,直到全部步骤处理完.

2021-01-09 14:35:05 525

原创 折腾日记:构建JDK9源码

作为JAVA开发者,JDK一定天天都会用到,所以想这周编译一下JDK源码,项目一直在使用JDK8,所以可以编译JDK9,这里的JDK指的是openJDK,每个版本的JDK编译都需要一个Boot JDK(可以参考building.html中编译指南),比如JDK9,就需要JDK8openJDK做为GPL许可(GPL-licensed)的Java平台的开源化实现环境准备CentOS7 64位Openjdk version “1.8.0_272”系统选择非常不建议在window环境

2020-12-20 15:52:05 507

原创 项目源码:使用AOP完成长任务轮询

AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。需求背景有一个接口实现合并文件,当文件过多时,预计要三分钟或者更长时间,这个时候前端调用的时候,就会出现接口的超时的问题,于是我使用了spring aop的方式,添加自定义注解,使得任务异步执行,前端长轮询查询任务的执行情况流程图代码实现自定义注解@Target(ElementType.METHOD)@Ret.

2020-12-13 22:36:55 126

原创 项目工具:Jenkins自动打包部署

项目现状由于项目一开始时间比较紧,没有考虑项目工厂发布的问题,都是人工打包编译后端代码JRR包,然后ftp上传至服务器,手动执行脚本,kill进程,再重启服务,随着,项目后期测试频繁,这样手工发布就觉得繁琐,于是,在本地虚拟机搞个Jenkins自动编译打包,上传至服务器,然后重启服务Jenkins是一个开源自动化服务器,可以自动执行持续集成和交付软件所涉及的重复技术任务。流程图[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O5bqUHfT-160784765447

2020-12-13 16:21:22 1702

原创 项目重构:设计模式(模板方法模式)

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。最近,在项目中,需要调用用户提供的接口发送微信模板信息,然后提供了信息模板{ "PersonnelType": "Inspector", "BusinessSysID": "0002", "UserID": "1111", "Mobile":"", "UnionID".

2020-12-04 00:19:55 410

原创 项目重构:设计模式(策略模式)

策略模式(Strategy Pattern)属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。其主要目的是通过定义相似的算法,替换if else 语句写法,并且可以随时相互替换。本文参考文章 设计模式最佳套路—— 愉快地使用策略模式由于项目中,有个需求,通过计费引擎对不同类型进行计费,但是每个类型的计费参数又不一样,一开始通过if-else解决if (typeA) { 逻.

2020-11-29 16:32:17 376

原创 个人代码规范

:之前和其他团队进行合作。由于不同团队的编写水平不一致,导致很多地方需要重新架构,其实难运维的原因,大部分原因是代码不规范,所以在修改的过程中,觉得还是把自己的代码习惯整理起来,便于以后进行查看,当然作为JAVA开发者,规范的第一圣经就是《阿里巴巴Java开发手册》,在这个基础之上,又增加了自己的代码规范规范的前提:程序员一定要有代码洁癖,才能对自己写的代码要精益求精1.一个方法只做一件事或者一个方向的事情1) 获取单个对象的方法用 get 做前缀。2) 获取多个对象的方法用 list 做前缀,复数

2020-11-08 11:54:25 710 1

原创 每日题解:LeetCode 241. 为运算表达式设计优先级

题目地址个人博客地址题目描述定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。示例 1:输入: "2-1-1"输出: [0, 2]解释: ((2-1)-1) = 0 (2-(1-1)) = 2示例 2:输入: "2*3-4*5"输出: [-34, -14, -10, -10, 10]解释: (2*(3-(4*5))) = -34 ((2*3)-(4*5)) = -1

2020-08-27 22:41:07 189

原创 每日题解:LeetCode 1008. 先序遍历构造二叉树

题目地址个人博客地址题目描述返回与给定先序遍历 preorder 相匹配的二叉搜索树(binary search tree)的根结点。(回想一下,二叉搜索树是二叉树的一种,其每个节点都满足以下规则,对于 node.left 的任何后代,值总 < node.val,而 node.right 的任何后代,值总 > node.val。此外,先序遍历首先显示节点的值,然后遍历 node.left,接着遍历 node.right。)示例:输入:[8,5,1,7,10,12]输出:[8,5,1

2020-08-19 20:57:48 127

原创 每日题解:LeetCode 109. 有序链表转换二叉搜索树

题目地址个人博客地址题目描述给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / /-10 5解法class Solution {publi

2020-08-18 21:03:21 227

原创 每日题解:LeetCode 43. 字符串相乘

题目地址个人博客地址题目描述给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = “2”, num2 = “3”输出: “6”示例 2:输入: num1 = “123”, num2 = “456”输出: “56088”说明:num1 和 num2 的长度小于110。num1 和 num2 只包含数字 0-9。num1 和 num2 均不以零开头,除非是数字 0 本身。不能使用

2020-08-13 22:43:07 129

原创 每日题解:LeetCode 901. 股票价格跨度

题目地址个人博客地址题目描述编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。例如,如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。示例:输入:["StockSpanner","next","next","next","next","next","ne

2020-08-07 22:28:21 319

原创 每日题解:LeetCode 1190. 反转每对括号间的子串

题目地址个人博客地址题目描述解法解题思路

2020-08-06 20:43:00 555

原创 每日题解:LeetCode 1019. 链表中的下一个更大节点

题目地址个人博客地址题目描述给出一个以头节点 head 作为第一个节点的链表。链表中的节点分别编号为:node_1, node_2, node_3, … 。每个节点都可能有下一个更大值(next larger value):对于 node_i,如果其 next_larger(node_i) 是 node_j.val,那么就有 j > i 且 node_j.val > node_i.val,而 j 是可能的选项中最小的那个。如果不存在这样的 j,那么下一个更大值为 0 。返回整数答案数

2020-07-30 22:46:55 574

原创 每日题解:LeetCode 144. 二叉树的前序遍历(中、后序遍历,以及递归、迭代写法)

题目地址个人博客地址题目描述给定一个二叉树,返回它的 前序 遍历。示例:输入: [1,null,2,3]12/3输出: [1,2,3]进阶: 递归算法很简单,你可以通过迭代算法完成吗?解法cpp迭代class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<Integer&gt

2020-07-27 22:33:07 139

原创 每日题解:LeetCode 454. 四数相加 II

题目地址个人博客地址题目描述给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。例如:输入:A = [ 1, 2]B = [-2,-1]C = [-1, 2]D = [ 0, 2]输出

2020-07-22 22:40:09 354

原创 每日题解:LeetCode 167. 两数之和 II - 输入有序数组

题目地址个人博客地址题目描述解法CPPclass Solution {public: vector<int> twoSum(vector<int>& numbers, int target) { int low = 0, high = numbers.size() - 1; while (low < high) { int sum = numbers[low] + numbers[high];

2020-07-20 20:59:21 133 1

原创 每日题解:LeetCode 35. 搜索插入位置

题目地址个人博客地址题目描述给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0解法JAVAclass Solution { public in

2020-07-17 22:00:40 290

原创 每日题解:LeetCode 120. 三角形最小路径和

题目地址个人博客地址题目描述解法解题思路

2020-07-14 22:28:31 142

原创 每日题解:LeetCode 174. 地下城游戏

题目地址个人博客地址题目描述一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值

2020-07-12 23:07:59 262

原创 每日题解:LeetCode 48. 旋转图像

题目地址个人博客地址题目描述给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:给定 matrix = [ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2], [9,6,3]]示例 2:给定 matrix =[ [ 5, 1, 9,11],

2020-07-09 23:19:34 171

原创 每日题解:LeetCode 112. 路径总和

题目地址个人博客地址题目描述给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1返回 true, 因为存在目标和为 22 的根节点到叶子节点的

2020-07-07 22:20:15 158

原创 每日题解:LeetCode 63. 不同路径 II

题目地址个人博客地址题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m 和 n 的值均不超过 100。示例 1:输入:[ [0,0,0], [0,1,0], [0,0,0]]输出: 2解释:3x3

2020-07-06 22:09:46 120

原创 每日题解:LeetCode 44. 通配符匹配

题目地址个人博客地址题目描述给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。示例 1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串示例 2:输

2020-07-05 20:36:08 192

原创 每日题解:LeetCode 32. 最长有效括号

题目地址个人博客地址题目描述给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: "(()"输出: 2解释: 最长有效括号子串为 "()"示例 2:输入: ")()())"输出: 4解释: 最长有效括号子串为 "()()"解法java栈public class Solution { public int longestValidParentheses(String s) { int ans = 0,

2020-07-05 00:34:17 122

原创 每日题解:LeetCode 718. 最长重复子数组

题目地址个人博客地址题目描述给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。示例:输入:A: [1,2,3,2,1]B: [3,2,1,4,7]输出:3解释:长度最长的公共子数组是 [3, 2, 1] 。 提示:1 <= len(A), len(B) <= 10000 <= A[i], B[i] < 100解法JAVAclass Solution { public int findLength(int[] A,

2020-07-01 22:42:01 190

空空如也

空空如也

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

TA关注的人

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