自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java开发支付功能(支付宝)

1、登录支付宝开放平台2、进入https://opendocs.alipay.com/open/291/105971下载工具3、点击打开密钥文件路径生成私钥和公钥4、将应用公钥加入到https://openhome.alipay.com/platform/appDaily.htm?tab=info 的RSA2(SHA256)密钥(推荐) 并且得到了支付宝的公钥5、maven<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipa

2020-11-01 19:16:12 1497 1

原创 JWT

JWT介绍:外表就是一字符串[令牌]由三段组成:JWT通常如下所示:xxxxx.yyyyy.zzzzz Header.Payload.SignatureHeader:令牌的类型(即JWT)和所使用的签名算法 然后对其进行base64UrlEncodePayload:所需要存放的数据 例如:{“username”:“jason”,“id”:“007”} 然后对其进行base64UrlEncodeSignature:签名,这部分尤其重要,因为该部分可以检验Header与Payload是否被人恶

2020-11-01 16:38:10 125

原创 shiro

什么是shiroshiro就是一个安全框架,可以对用户进行认证和授权认证:就是对用户身份的一种确认,只有用户的身份符合标准,那就可以认证成功。授权:在认证之后,可以对已经获得认证的用户授予权限(就是允许他们做什么事情)几个重要的概念1、Subject,可以把它看成浏览器2、SecurityManager,安全管理器 主要管理的是认证、授权、缓存、会话…3、 Authenticator,认证器 负责认证4、Authorizer,授权器 负责授权5、Realm,就是对用户进行认证和授权的地方

2020-11-01 15:24:41 159

原创 数组中重复的数字

题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。要求时间复杂度O(N),空间复杂度为O(1)思路:另开空间标记以及排序的做法肯定是行不通的,题目有说[所有数字都在0到n-1的范围内],那么可以将值为 i 的元素调整到第 i 个位置上进行求解public class Solutio

2020-07-30 23:02:55 101

原创 LeetCode之除数博弈

题目:除数博弈思路:我们必须明确的是最终让爱丽丝赢。如果Alice拿到N=1:则输如果Alice拿到N=2:则赢如果Alice拿到N=3:则输,因为X只能取1,Bob就拿到了N=2,而我们知道拿到N=2的人必赢如果Alice拿到N=4:则赢,因为Alice可以选择取X=1,然后Bob的N=3,因为N=3必输如果Alice拿到N=5:则输,因为Alice可以只能取X=1,则Bob的N=4,参考得Bob必赢以此类推,我们好像可以得出只要N是偶数则Alice必赢。证明:当N=偶数时,由于是Alic

2020-07-26 10:27:14 115

原创 LeetCode之爬楼梯

题目:爬楼梯思路: 比如 n=10;那么有两种情况:1、 9 + 1 = 102、 8 + 2 = 10说明从第9或者第8个台阶可以直接跨到第10个台阶,所以跨到第10个台阶的方法数 = 跨到第9个台阶的方法数 + 跨到第8个台阶的方法数 …依次类推即可class Solution { int sum = 0; public int climbStairs(int n) { int[] arr = new int[n+1]; arr[0]

2020-07-25 11:01:16 70

原创 LeetCode之连续子数组的最大和

题目:连续子数组的最大和/*思路:假设现在遍历到下标为K的数,这时我们需要比较 K数是否比 K之前数的和+K数 大,如果是则说明K之前数的和肯定是负数,那么我们下次就从K下标开始算起 , 如果不是 那么就继续加下去即可需要注意的是,当我们遇到负数的时候,就要停下来计算max的值return max > sum ? max : sum 这句是为了避免忘记计算正数的最大值 */class Solution { public int maxSubArray(int[] nums) {

2020-07-17 16:49:32 79

原创 LeetCode之玩筹码

题目:玩筹码思路: 算出在偶数根棍子上的筹码数, 奇数根棍子上的筹码数 ;二者中的最小值就是结果。 因为我们可以通过0代价把所有筹码都移动到两根棍子上,然后把其中一根棍子上筹码较少的筹码通过1代价一个个移动筹码较多的棍子上即可class Solution { public int minCostToMoveChips(int[] chips) { int even = 0; int odd = 0; for (int chip : chips) {

2020-07-15 13:55:32 97

原创 java创建对象过程

创建对象的方式:new最常见的方式:new A();单例:A.getInstance();设计模式的建造者、工厂模式的静态方法反射1:Class的newInstace(),不推荐 使用条件苛刻(只能调用空参构造器 并且 权限必须是public)反射2:Constructor的newInstance(Xxx) ,可调用有参,并且无权限要求使用clone:不使用任何构造器,当前类需要实现Cloneable接口,重写clone()使用反序列化:从文件、从网络中获取一个对象的二进制流第三方

2020-07-15 12:25:22 159

原创 基于Netty的简易版RPC

customer端:接口:public interface Hello { String sayHi(String message);}实现类:public class Customerimpl implements Hello { @Override public String sayHi(String message) { return null; }}创建customer:public class CustomerRpc impl.

2020-07-13 23:46:53 119

原创 LeetCode之最长不含重复字符的子字符串

题目:最长不含重复字符的子字符串思路: 遍历字符串,把字符加入到hashmap中,key存字符,value存下标;如果出现重复的字符,那就求开头下标到此value之间的长度,则下次开头的下标就是重复的字符对应的下标+1;class Solution { public int lengthOfLongestSubstring(String s) { HashMap<Character, Integer> map = new HashMap<>();

2020-07-12 13:55:13 63

原创 LeetCode之分数到小数

题目:分数到小数class Solution { public String fractionToDecimal(int numerator, int denominator) { ArrayList<Long> list = new ArrayList<>(); StringBuilder sb = new StringBuilder(); long result = numerator / denominator;

2020-07-12 10:42:57 129

原创 LeetCode之出现次数最多的子树元素和

题目:出现次数最多的子树元素和class Solution { HashMap<Integer,Integer> map = new HashMap<>(); public int sum(TreeNode root){ if (root == null) return 0; int leftSum = sum(root.left); int rightSum = sum(root.right

2020-07-10 19:41:06 73

原创 LeetCode之数对和

题目:数对和class Solution { public List<List<Integer>> pairSums(int[] nums, int target) { HashMap<Integer, Integer> map = new HashMap<>(); List<List<Integer>> answer = new ArrayList<List<Integer>

2020-07-09 13:50:16 99

原创 每天一道LeetCode题之翻转等价二叉树

题目:翻转等价二叉树笨比写法(我写的):class Solution { public boolean flipEquiv(TreeNode root1, TreeNode root2) { int root1Num = 0; int root2Num = 0; if(root1 == null && root2 == null) return true; if (root1 != n

2020-07-04 13:15:04 87

原创 每天一道LeetCode题之寻找重复的子树

题目:寻找重复的子树class Solution { Set<TreeNode> set = new HashSet<>(); Map<String,TreeNode> map = new HashMap<>(); public void preTraverse(TreeNode root){ if (root == null) return; examine(root);

2020-07-03 11:24:49 82

原创 java深拷贝

浅拷贝:ABC a = new ABC();ABC b = a;如果在对象b中把某个域值改了,那么对象a对应的域值也会跟着变化深拷贝:把b改了,a保持原样不管浅、深拷贝都要实现Cloneable接口,然后重写父类的clone方法(如果类中只有基本数据类型[包括String],不用重写该方法也可以)如果ABC类中只有基本数据类型域(包括String):public class testClone implements Cloneable{ String name; int

2020-07-02 23:15:26 104

原创 每天一道LeetCode题之所有可能的满二叉树

题目:所有可能的满二叉树class Solution { public List<TreeNode> allPossibleFBT(int N) { List<TreeNode> list = new ArrayList<>(); //N必须是奇数的,偶数无法构造满二叉树 if (N % 2 == 0){ return list; } //递归跳出条件,只

2020-07-02 16:33:12 124

原创 每天一道LeetCode题之祖父节点值为偶数的节点和

题目:祖父节点值为偶数的节点和思路:遍历树的各个结点,如果该结点的值是偶数 那就把这个结点的孙子结点的值统统加起来。 最后返回即可class Solution { int sum ; public int sumEvenGrandparent(TreeNode root) { getSum(root); return sum; } public void getSum(TreeNode root){ if (root ==

2020-07-02 10:25:42 134

原创 每天一道LeetCode题之 N叉树的后序遍历

题目:N叉树的后序遍历递归解法:解法和二叉树的递归后序遍历差不多,class Solution { public List<Integer> list = new ArrayList<>(); public List<Integer> postorder(Node root) { if (root == null) return list; for (int i = 0; i < root

2020-07-01 11:35:39 89

原创 每天一道LeetCode题之对称二叉树

题目: 对称二叉树我使用的的是非递归解法,所以相对于递归解法来说代码量会比较多且时空性能比较低 --------但是这也是一个思路思路非常简单:我们可以从上到下比较每一层的左半部分结点与右半部分结点是否镜像相同即可,(最左与最右比,次左与次右比较…以此类推)public class Solution { public boolean isSymmetric(TreeNode root) { Queue<TreeNode> queue = new LinkedLis

2020-06-30 11:41:48 63

原创 每天一道LeetCode题之二叉搜索树的最近公共祖先

题目:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { TreeNode froot = root; TreeNode sroot = root

2020-06-29 18:37:33 77

原创 利用哈夫曼压缩文件

package com.jason.huffman;import java.io.*;import java.util.*;import java.util.zip.ZipOutputStream;public class HuffmanCodesDemo { public static void main(String[] args) {// String str = "iiii loveeee youuuuu";// byte[] zipArr = .

2020-06-21 11:50:51 122

原创 哈夫曼树和哈夫曼编码

哈夫曼树假设有N个结点,现在我们需要把这N个结点弄成一棵树,当然了并不是随随便便的一棵树,构造这棵树的要求是:第一:这N个结点必须是这棵树的叶子结点(即没有孩子结点的结点),第二:在这N个结点中 值大的的结点在上面,值小的的结点在下面。第三:因为要连接叶子结点,所以肯定需要创建新的结点,该新的结点就作为叶子结点的父结点,该父结点的值就是两个子结点和的值。例子:哈夫曼树/*1、先将珠宝们从小到大排序2、找出最小的两个3、将这两个融合起来,提炼成一颗价值叠加的玛瑙珠宝4、重复执行以上步骤,将会

2020-06-20 16:40:21 131

原创 Springboot文件上传与下载

文件下载public void download(HttpServletRequest request, HttpServletResponse response) throws IOException { try { request.setCharacterEncoding("UTF-8"); String filename = request.getParameter("name"); String mimeTyp

2020-06-18 23:44:17 78

原创 最长不重复子串

public class LongestUnrepeatedString { public static void main(String[] args) { System.out.println(getLUS("abcdeb")); System.out.println(getLUS("abcde")); System.out.println(getLUS("abcarcbh")); } public static Strin.

2020-06-17 19:33:51 99

原创 枚举类java

枚举类enum Season{ SPRING("春天"){ public int count(){ return 9; } @Override public void say() { } }, SUMMER("夏天") { @Override public void say() { } }, WIN

2020-06-16 22:04:45 69

原创 分治算法

分治算法汉诺塔:现在A柱子上有三个盘子,如果A柱子只有一个盘子就好了(解决)我们就可以直接把盘子从A拿到C;于是乎,萌生了一个想法,我们可以把1,2,3号盘子看成只有两部分组成,即 (1,2)-----3 (分解) 然后把(1,2)从A移动到B,再把3移动到C,最后把(1,2)从B移动到C。现在的问题又变成了如何把1,2号盘子移动到B,其实步骤还是和上面一样,我们可以继续分解,分成1, 2号盘子(它们现在都是独立的),然后先把1号盘子从A移动到C,再把2号盘子从A移动到B,最后把1号盘子从C移动到B

2020-06-16 20:39:26 109

原创 哈希表

哈希表例子:现在需要插入N个数字,然后用哈希表实现;思路:可以先建一个数组,大小是10;然后判断新加入元素的个位数的值当然了上面举了一个很简单的例子,实际中也不会只采用大小为10的数组,因为如果数据量很多,就难以避免链子会很长。所以选择哪个数字作为数组的大小就尤其重要。假设当前数组大小为S,加入的数大小为W,那么该数要加入到数组的下标为L; 公式: L = W % S, 这样可以保证L一定小于S,就不会导致越界问题。综合举例:校长代码:在这里插入代码片...

2020-06-16 16:41:31 263

原创 反向代理服务器Nginx

Nginx介绍:是个服务器作用:其主要解决的是,当有很多个客户端访问多个服务器时(大于一个),的分配策略 ,缓解了服务器的压力功能:反向代理、动静分离、负载均衡、高可用集群 (这四个就是分配策略)分点说明:反向代理代理:中间人的意思,情景A: 小A(客户端)同学想去一个店名叫“渴了吗”的店(目标服务器)买水喝,但是他的脚受伤了,所以拜托了小B(代理服务器)同学帮忙买水 ,小B买到水后,将水交给小A情景A就是正向代理情景B: 小A(客户端)同学想去买水喝,但是他的脚受伤了,所以拜托

2020-06-16 15:35:12 91

原创 斐波那契查找算法

斐波那契查找算法斐波那契查找与二分查找差不多,区别在于 二分查找的mid 使用除法算出来,而斐波那契查找的mid是用加减法算出来的,计算机对于 加减法的处理速度快于除法,尤其是在大数据量以及单个数值很大时尤其明显。待排数组元素个数一定要是斐波那契数,如果不是我们就强行加长数组,多的空间用原待排数组的最后一个元素填充。 /* 使用fibonacci查找算法的目的: Fibonacci查找算法其实本质上就是二分查找算法 只不过二分查找算法求mid时,用的是除

2020-06-14 22:54:18 452

原创 插值查找算法

插值查找算法二分查找:1 2 3 4 5 6 7 8 9…1000000000;需要查找元素1的下标,结果要查询log2 1000000000 次。这是耗时的,而插值查找算法则可以快速定位插值查找 与 二分查找主要区别 就是 mid取值的不同二分:mid = (left + right) / 2插值:mid = left + (right-left) * (findVal - arr[left])/(arr[right]-arr[left]); public static List<I

2020-06-14 20:49:33 76

原创 二分查找

二分查找 --递归 public static List<Integer> half(int[] arr,int left,int right,int findVal){ //如果查找元素小于一个,直接返回空 if (left > right){ return null; } //以中间元素为查找对象 int mid = (left+right)/2;

2020-06-14 20:34:04 83

原创 八大排序之堆排序

堆排序堆有分大顶堆和小顶堆,其中大顶堆的意思父结点总是比其子结点大,小顶堆的意思父结点总是比其子结点小。如果是升序就用大顶堆,降序就用小顶堆对于升序来说,堆排序第一步就要把一颗树转换成大顶堆转化成大顶堆的方法:从最后一个非叶子结点开始一直到头结点为止,要把这些个结点的子结点小于它们即可;即:第二步:我们已经知道该大顶堆的第一个结点的值肯定是最大的,所以我们就把第一个结点的值与最后一个结点的值进行交换,然后继续检查第一个结点的子结点是否大于其左右子结点,很明显肯定不是的;所以就交换父子结点,然后

2020-06-14 18:13:42 257

原创 八大排序之桶排序

桶排序因为一个十进制数,个位或者十位或者百位或者…上的可能取值有十种情况,分别是0~9,所以有10个桶,每个桶里面之所有分8层,是因为上面的例子有8个数需要排序第一轮后:第一轮是根据个位数的值放入桶的。然后再按从左到右,从上到下的顺序把桶里的值依次赋值到原数组中,得:210,100,200,10,23,326,8,99第二轮:第三轮:至此已经排序完毕public static void Bucketsort(int[] arr){ //十进制即十个桶

2020-06-14 16:19:59 181 1

原创 八大排序之快速排序

快速排序 //arr:待排数组,left:待排数组最左小标,right:待排数组最右下标 public static void quick(int[] arr,int left,int right){ int mid=(left+right)/2; int l=left; int r=right; int pivot=arr[mid];//以中间的元素为基准,进行比较 //左右指针不能越界

2020-06-14 13:38:31 83

原创 八大排序之归并排序

归并排序核心:先拆后合不多逼逼,直接上图看完图,肯定已经明白一大部分了。 //该方法是:拆 ------- arr:待排数组,left:第一个元素下标,right:最后一个元素下标,temp:临时数组 public static void divide(int[] arr,int left,int right,int[] temp){ //如果不止一个元素就拆 if (left < right){ //往中间一刀切

2020-06-14 10:54:10 83

原创 八大排序之希尔排序

希尔排序学希尔排序之前,必须要有插入排序算法的基础插入排序算法:八大排序之插入排序可以这么说,希尔排序就是对插入排序的优化为什么这么说呢?场景:2,3,4,5,6 ,1现在轮到把 1 插入到正确的位置上, 很明显肯定是插在第一位,即:1 2 3 4 5 6,但是可以看出要比较5次,虽然5次并不多,但是在大数据量的情况下,这个比较次数就有些恐怖了;这时希尔排序横空出世,其算法思路很简单,即:不再像插入排序一样,一个一个的往前的比较;而是跨距离比较。上面的例子:2,3,4,5,6 ,1思路:

2020-06-13 23:26:21 118

原创 八大排序之插入排序

插入排序要求:现在有ABCDE五个盒子,现在需要把它们按照从小到大的排序插入排序算法思路:第一轮:从B开始往前比较,如果B大于A,则直接下一轮,反之,交换AB第二轮:从C开始往前比较,如果C大于B,直接下一轮,不用再去比较C,A的大小,因为如果C大于B,则C一定大于A(因为B大于A);如果C小于B,那么首先用一个变量K把C的值先保存起来,然后再把B的值赋给C;如果C还小于A,那就将A的值赋给B,最后把K值赋给A,如果C大于A,那就将K值赋给B;第三轮:……如果有N个数,那么就需要N-1轮,因

2020-06-13 21:33:28 271

原创 八大排序之选择排序

选择排序要求:将上面的三个盒子从小到大排序;选择排序算法思路:第一轮,选出第一小的盒子,放在第一个位置上第二轮,选出第二小的盒子,放在第二个位置上……所以:有N个数,就需要N-1轮,每一轮中需要比较N-K次,其中K代表第K轮 public static void Select(int[] arr){ for (int i=0;i<arr.length-1;i++){ int minIndex=i;

2020-06-13 19:57:06 94

空空如也

空空如也

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

TA关注的人

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