java
于对对
这个作者很懒,什么都没留下…
展开
-
2021-07-22 有限自动状态机示例
有限自动状态机说明大多数介绍有限自动状态机的帖子都是写了原理,那这个原理怎么落地呢。我找了一个简单易于理解的示例写一下。说明有限自动机有3个部分:1,当前状态,2,当前输入,3,当前状态对应的当前输入,所应该执行的操作。其中,3会产生一个新的状态1。对应一个新的输入2。从而实现循环举例:一个状态:[x,y]。 初始状态为 [1,0]对应的输入:A,BA对应的操作:产生新的状态 [2 * x + y,y ]B对应的操作:产生新的状态 [x, 2 * y + x]图示如下:原创 2021-07-22 14:17:50 · 264 阅读 · 0 评论 -
算法:连续子数组的长度
题目:给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。要求:0和1在子数组中连续例如:nums = [0,1]输出 2nums = [0,1,0]返回 2nums = [0,0,1,1,0,1]返回 4解法:class Solution { // 子数组中的0,1要求连续 public int findMaxLength1(int[] nums) { int num1 = 0; // 前1个原创 2021-06-03 17:35:55 · 342 阅读 · 0 评论 -
连续的子数组和
题目:给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:子数组大小 至少为 2 ,且子数组元素总和为 k 的倍数。如果存在,返回 true ;否则,返回 false 。如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。解法:递归遍历(时间复杂度高,但递归这种基本操作还是要熟练掌握的)代码:(我刚开始一直写错,原因是没注意到子数组要是连续的)class Solution { pu原创 2021-06-02 19:36:53 · 214 阅读 · 0 评论 -
root is not allowed to impersonate hadoop
hive远程连接提示:org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationExceptionUser: root is not allowed to impersonate admin解决办法:(两个都要加)在 core-site.xml中加入 <property> <name>hadoop.proxyuser.root.hosts&原创 2021-04-13 20:07:05 · 928 阅读 · 1 评论 -
PdfReader 2:this.readPdf() -5 60 DIC、array 类型
{ # 如果ch==60,< case 60: # 下一个字符,如果还是60,则说明还是 字典的< ,否则就是内部的字符串 v1 = this.file.read(); if (v1 == 60) { this.type = PRTokeniser.TokenType.START_DIC; } else { outBuf = new StringBuffer();原创 2021-01-30 15:40:59 · 319 阅读 · 0 评论 -
PdfReader 2:this.readPdf() -4 PdfName
代码如下:public class PdfName extends PdfObject implements Comparable<PdfName> { ... public static final PdfName IMAGE = new PdfName("Image"); ... //很多的pdfname 对象 public static Map<String, PdfName> staticNames; // 静态变量,用于存储所有的静态名称 priva原创 2021-01-25 20:38:44 · 710 阅读 · 0 评论 -
PdfReader 2:this.readPdf() -3 name类型
case47 就是 name 类型。在分析 case47 之前,先了解一下name类型。PdfName 类型{ case 47: outBuf = new StringBuffer(); this.type = PRTokeniser.TokenType.NAME; while(true){ ch = this.file.read(); if(delims[ch +1]) { this.backOnePosition(ch); break; } i原创 2021-01-24 14:22:08 · 156 阅读 · 0 评论 -
PdfReader 2:this.readPdf() - 2:字符串类型
这一篇来分析 case 40,也就是 pdf 的字符串类型,以 ( 开头,以)结尾。1,先回忆一下状态机算法:switch (变量a):case 状态1:变量a = 某某某1;case 状态2:变量a = 某某某2;然后看代码:看大结构:{ while(true){ // 获取复合条件的ch while(true){ //...... } if (v1 == -1){ break; } // 将ch放入buf outBuf.append((char)原创 2021-01-22 14:35:51 · 183 阅读 · 1 评论 -
PdfReader 2:this.readPdf() - 1;
pdfreader 的主要部分package com.itextpdf.text.pdfpublic class PdfReader implements PdfViewerPreferences {// 这个方法里面有很多对象 protected void readPdf() throws IOException { try { this.fileLength = this.tokens.getFile().length(); // 这个token 就原创 2021-01-19 19:46:42 · 397 阅读 · 0 评论 -
PdfReader 1:this.tokens = new PRTokeniser(filename);
这个过程,其实就是打开pdf文件,并映射到内存package com.itextpdf.text.pdf;public class PRTokeniser { public PRTokeniser(String filename) throws IOException { this.file = new RandomAccessFileOrArray(filename); // 所以,最终文件存于 file.rf.mappedByteBuffer }}pack原创 2021-01-15 20:01:13 · 254 阅读 · 0 评论 -
PDF解析:目录(itextpdf)
想要读懂 itextpdf 的源代码,要多调试,对整个代码的脉络掌握个大概,形成一个目录,再分析细节。所以我的目录其实是这个源码的流程轨迹1,先要读取pdfpublic class PdfReader implements PdfViewerPreferences{ public PdfReader(String filename) throws IOException { this((String)filename, (byte[])null); } publi原创 2021-01-15 19:59:40 · 723 阅读 · 1 评论 -
算法:单词规律
题目给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。示例1:输入: pattern = “abba”, str = “dog cat cat dog”输出: true分析其实就是对应位置,pattern 对应位置的字符相同,则 str 对应位置的字符串也相同。代码class Solution { public bool原创 2020-12-16 20:38:20 · 161 阅读 · 0 评论 -
算法:字母异位词分组
题目给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]本题很明显是用 hash 来实现的。只是怎么做可能有一点点绕吧String 转为 char[]排序,再转为string将结果作为 map 的key, 转换前的 string 放入 list中,作为 ma原创 2020-12-14 20:32:50 · 133 阅读 · 0 评论 -
算法:649. Dota2 参议院
题目Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:禁止一名参议员的权利:参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。宣布胜利: 如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。给定一个字符串代表每个参议员的阵营。字转载 2020-12-11 21:00:58 · 120 阅读 · 1 评论 -
算法:相同的树
题目给定两个二叉树,编写一个函数来检验它们是否相同。遍历即可,左边的树左边的树,右边的树右边的树,如果不相等则返回false。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = v原创 2020-12-08 20:30:29 · 104 阅读 · 0 评论 -
算法:杨辉三角
题目根据数字 numRows, 生成 numRows 行的杨辉三角[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1],]思路,杨辉三角只有第一行和第二行比较特殊,其他行都是1…1,中间由上一行的两个数相加获得。代码class Solution { public List<List<Integer>> generate(int numRows) { LinkedList<List<Integer&原创 2020-12-06 22:33:30 · 152 阅读 · 0 评论 -
算法:分割数组为连续子序列
题目leetcode659https://leetcode-cn.com/problems/split-array-into-consecutive-subsequences/给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。如果可以完成上述分割,则返回 true ;否则,返回 false 。示例 1:输入: [1,2,3,3,4,5]输出: True解释:你可以分割出这样两个连续子序列 :转载 2020-12-05 00:35:02 · 217 阅读 · 0 评论 -
算法:计数质数的数量
题目统计所有小于非负整数 n 的质数的数量。思路质数的百度解释:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。创建一个数组,长度为n,填充为1.首先2是质数,从2开始,2的所有倍数都标记为0然后计算下一个,3,将3的所有倍数都标记为0重复上述步骤最后统计数组中,从下标为2开始,统计 1 的数量即可代码class Solution { public int countPrimes(int n) { int[] isPrime = new i原创 2020-12-03 20:44:08 · 283 阅读 · 0 评论 -
算法:在排序数组中查找元素的第一个和最后一个位置
题目给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。代码class Solution { public int[] searchRange(int[] nums, int target) { // 初始化返回值 int[] res = new int[]{-1,-1}; int count=0; // 这个count代原创 2020-12-02 23:21:28 · 290 阅读 · 0 评论 -
算法:上升下降字符串
连着熬了几个夜上线,实在没时间过来,今天终于上去了题目给你一个字符串 s ,请你根据下面的算法重新构造字符串:从 s 中选出 最小 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。重复步骤 2 ,直到你没法从 s 中选择字符。从 s 中选出 最大 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选出 最大 的字符,且该字符比上一个添加的字符小,将它 接在 结果字符串后面。重复步骤 5 ,直到你没法从原创 2020-11-26 17:49:03 · 106 阅读 · 0 评论 -
算法:有效的字母异位词
题目判断两个字符串s和t,是不是字母异位词。字符串只包含小写字母也就是说,s的所有字母和t都一样,只是位置不同。例如:输入: s = “anagram”, t = “nagaram”输出: true解题这道题呢,就相对简单些了。因为题目中说了字符串都是小写字母,那就可以用26个字母的数组来存放字符串的每个字母。新建数组 hex ,长度为26.1,遍历s,对应hex每个字符位置,+12,遍历t,对应hex每个字符位置,-13,遍历hex,判断是不是都为0,只要不是就返回false代码原创 2020-11-22 16:23:31 · 135 阅读 · 0 评论 -
算法:排序链表:归并排序
题目:给定链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。head = [4,2,1,3]输出:[1,2,3,4]解题1,最简单的算法,就是挨个遍历链表,将其加入数组,通过数组排序。但这样的空间复杂度比较高。2,我们学过归并排序。那就用归并排序来解题。概念:归并排序就是有 n 个数字:2,4,1,5,3…先两个两个的排序,再两组两组的排序。代码/** * Definition for singly-linked list. * public class Lis原创 2020-11-21 19:16:21 · 181 阅读 · 1 评论 -
算法:移动零
题目给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]代码class Solution { public void moveZeroes(int[] nums) { int i=0; int len=nums.length; while(i<len){ if (nums[i]==0){原创 2020-11-19 18:16:10 · 86 阅读 · 0 评论 -
算法:根据身高重建队列
题目:假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。注意:总人数少于1100人。示例输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]不会做的时候,先看看答案,对着答案画个图,也可以懂代码class Solution { pub转载 2020-11-16 20:47:03 · 79 阅读 · 0 评论 -
算法:数组的相对排序
题目给你两个数组,arr1 和 arr2,arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。解题int 数组排序可以用自定义排序函数的方式来实现此处对于自定义函数中,需要比较的两个对象t1、t2有4种情况。1,t1 和 t2 都在 arr2中2,t1 和 t2 都不在arr2中3,t1 在 arr2 中,t2不在原创 2020-11-14 15:08:17 · 259 阅读 · 0 评论 -
算法:奇偶链表
题目给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。思路其实就是调换单链表的顺序,把所有奇数节点放在前面,偶数节点放在后面代码/** * Definition for singly-linked list. * public class ListNode { * int val原创 2020-11-13 18:43:13 · 101 阅读 · 0 评论 -
算法:leetcode 514 自由之路
题目视频游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。给定一个字符串 ring,表示刻在外环上的编码;给定另一个字符串 key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。最初,ring 的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。旋转 ring 拼出 ke转载 2020-11-12 20:54:29 · 91 阅读 · 0 评论 -
算法:leetcode31. 下一个排列
会就偷着乐,不会就赶紧看看答案学起来,要不然做题干啥题目实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1过程本来还以为有啥技巧,想了半天没想到,一看答案,原来就是死算~……class Solution {转载 2020-11-10 20:41:15 · 62 阅读 · 0 评论 -
算法:最接近原点的 K 个点
题目我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。(这里,平面上两点之间的距离是欧几里德距离。)例如:输入:points = [[1,3],[-2,2]], K = 1输出:[[-2,2]]分析如题也就是说,求出前K个离 (0,0)最近的点。那就要排序。距离如何排序?先用勾股定理求出距离。ok,思路好了,接下来就是代码class Solution { public int[][] kClosest(int[][] poin原创 2020-11-09 18:58:47 · 560 阅读 · 0 评论 -
算法:根据数字二进制下 1 的数目排序
题目给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。思路本题首先要将数字转变为二进制,然后再统计二进制中的1的数量。如果1的数量相同,则按数值的大小排列。所以本题的关键在于compare的重写代码class Solution { public int[] sortByBits(int[] arr) { Integer[] new原创 2020-11-07 17:55:26 · 329 阅读 · 0 评论 -
算法:插入区间
题目给出一个无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果重叠,则合并区间)。示例 1:输入:intervals = [[1,3],[6,9]], newInterval = [2,5]输出:[[1,5],[6,9]]思路1,先写一个方法,用于判断两个数组是否重叠,如果重叠,则返回合并后的数组。否则,返回哪个数组2相对于数组1 的位置。2,遍历二维数组,依次判断是否与数组2重叠,以及重叠的位置。直到没有重叠的位置。同时,将原创 2020-11-04 14:11:11 · 291 阅读 · 0 评论 -
算法:有效的山脉数组
题目:给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false。解释:就是说,数组A先递增,后递减。不可有相等的部分。思路:1,找出数组中的最大值2,0-最大值:递增3,最大值-数组结束:递减否则,返回falseclass Solution { public boolean validMountainArray(int[] A) { int a = 0; int index = 0; boolean res =原创 2020-11-03 22:27:22 · 168 阅读 · 0 评论 -
算法:求两个数组的交集
思路1,将两个数组分别排序2,同时遍历两个数组,将相同的数字放入set 集合3,将set 集合转换为 数组代码class Solution { public int[] intersection(int[] nums1, int[] nums2) { LinkedHashSet<Integer> res_set = new LinkedHashSet<Integer>(); Arrays.sort(nums1); Ar原创 2020-11-02 17:32:33 · 713 阅读 · 0 评论 -
算法:leetcode129 求根到叶子节点数字之和
题目:给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。输入: [1,2,3] 1 / \ 2 3输出: 25解释:从根到叶子节点路径 1->2 代表数字 12.从根到叶子节点路径 1->3 代表数字 13.因此,数字总和 = 12 + 13 = 25.解法:这道题,题意就是遍历二叉树,先遍历根节原创 2020-10-29 19:36:06 · 124 阅读 · 0 评论 -
算法: 二叉树前序遍历
首先,要明白什么是前序遍历。前序遍历在二叉树中的访问路径为:根节点 -》 左节点-》 右节点。代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } *原创 2020-10-27 20:18:31 · 107 阅读 · 0 评论 -
算法:LeetCode1365. 有多少小于当前数字的数字
题目:https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number/题解:这道题用暴力解法肯定是比较简单的 public int[] smallerNumbersThanCurrent(int[] nums) { int size = nums.length; int[] res = new int[size]; for (int i=0;i转载 2020-10-26 23:07:35 · 77 阅读 · 0 评论 -
算法:LeetCode845. 数组中的最长山脉
题目:https://leetcode-cn.com/problems/longest-mountain-in-array/今天的题目啊,依然是不那么好看明白。其实啊,就是对于一个数组 [2,1,4,7,3,2,5],找到其中的 先递增,再递减的子数组,并返回这类子数组的最大长度。如果没有这类子数组,则返回0例如[2,1,4,7,3,2,5]的最大 先递增,再递减的子数组为【1,4,7,3,2】,长度为5.好了,最大长度啊,最什么这种,看看能不能用动态规划解法。想要获得最大长度,就要先找到山顶。然转载 2020-10-25 18:15:11 · 131 阅读 · 0 评论 -
算法:leetcode1024. 视频拼接
题目:https://leetcode-cn.com/problems/video-stitching/分析:其实这道题,我只想说,这语文也太难懂了,看了半天晕晕乎乎不知道题目啥意思。其实题目意思是,给了一个二维数组 clips,一个 int 类型的 T问,能不能用二维数组,组成一个 一维数组,这个数组为[0,T],如果可以,返回需要二维数组中的最少 子数组 数量。否自返回-1代码: public int videoStitching(int[][] clips, int T) {转载 2020-10-24 18:26:27 · 349 阅读 · 0 评论 -
算法:判断是否回文链表
题目:判断一个链表是否回文链表回文链表的特点是从中间分开,往两边完全对称。步骤:1,找到回文链表的中间节点2,翻转后半段链表3,从头部开始,与翻转后的后半段链表比较。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Soluti原创 2020-10-23 18:15:28 · 101 阅读 · 0 评论 -
算法:长按键入
题目:输入 name时。按键可能会被长按,导致字符可能被输入 1 次或多次。检查键盘输入的结果字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。分析其实这个题目,就是比较两个字符串,一共有3种情况。初始化两个指针 i,j分别指向name 和 typed的01,字符串相同,则 i 和 j 同时 +12,字符串不同,但 typed 对应 j 位置的字符串和 j-1 位置的字符串相同,则 j+13,其他情况,直接跳出循环。返回 false遍历完字原创 2020-10-21 20:53:12 · 232 阅读 · 0 评论