- 博客(83)
- 收藏
- 关注
转载 linux常见命令:查看端口是否被占用
netstat这个命令常用在网络监控方面,可以查看当前系统监听的服务和已经建立的服务,以及相应的端口、协议等信息。1. 常见参数设置netstat参数虽然很多,但是常用的不多,主要是下面几个参数:netstat -[atunlp]-a :all,表示列出所有的连接,服务监听,Socket资料-t :tcp,列出tcp协议的服务-u :udp,列出udp协议的服务-n :port number, 用端口号来显示-l :listening,列出当前监听服务-p :program,列出服务程序的
2021-09-11 10:44:22
3577
原创 三个线程分别打印 A,B,C-常规算法
三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC…”的字符串.思路:使用一个取模的判断逻辑 C%M ==N,题为 3 个线程,所以可以按取模结果编号:0、1、2,他们与 3 取模结果仍为本身,则执行打印逻辑。import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ThreadPrint { priva
2021-08-30 16:26:16
677
原创 LeetCode 61-旋转链表
给你一个链表的头节点 head,旋转链表,将链表每个节点向右移动 k 个位置。解题思路:整体思路:将链表变成环,其次在合适的位置上断开连接。首先遍历链表,找到链表尾节点修改其next指针,将其指向头节点,将链表连接成循环链表,同时计算链表长度。再次遍历链表,在len - k % len的节点断开连接。具体代码:class Solution { public ListNode rotateRight(ListNode head, int k) { if(head ==
2021-08-02 20:00:14
247
原创 LeetCode 143-重排链表
给定一个单链表 L 的头节点 head ,单链表 L 表示为:L0 → L1 → … → Ln-1 → Ln请将其重新排列后变为:L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。实例:输入: head = [1,2,3,4]输出: [1,4,2,3]解题思路:从题目中的表述中,我们可以知晓重新排列的链表就是两个半链表合并在一起的。因此,我们可以对这个过程进行模拟。具体:找到链表中间点,断开连接,形成两个
2021-07-28 16:11:10
196
原创 LeetCode 20-有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。解题思路:当遇到左括号时,栈内压进相反的右括号。如果遇到右括号,从栈内取出相同的括号,如果此时栈内为空或者栈顶括号不符,直接返回false。具体代码:class Solution { //利用栈先进后出 stack 局部变量 //当stack 压栈不成功后 后进去的括号自动弹出来 循环一次弹出一次
2021-07-28 15:58:17
93
原创 LeetCode 232-用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false解题思路:栈的特点是“先进后出”,而队列的特点是“先进先出”。因此我们可以利用两个栈实现队列的特性。首先将一个栈当作输入栈,用
2021-07-28 11:56:04
89
原创 LeetCode 84-柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。输入:heights = [2,1,5,6,2,3]输出:10解释:最大的矩形为图中红色区域,面积为 10解题思路:遍历每根柱子,将当前柱子 i 的高度作为矩形的高,随后我们需要进行向左右两边扩展,使得扩展到的柱子的高度均不小于 h。即找到左右两侧最近的高度小于 h 的柱子这样这两根柱子之间(不包括其本身)的所有柱子高度均不小于 h,并且就是 i 能够扩展到
2021-07-22 19:47:16
110
转载 LeetCode 102-二叉树的层序遍历
给你一个二叉树,请你返回其按层序遍历得到的节点值。 (即逐层地,从左到右访问所有节点)。解题思路:首先我们需要了解什么是层序遍历。如下图:将二叉树按照层进行划分,依次从左至右输出每一层的节点即可。我们可以利用队列进行模拟。具体代码:class Solution { public List<List<Integer>> levelOrder(TreeNode root) { // 1. 保存最后的结果 List<List<Int
2021-07-19 14:57:07
85
转载 LeetCode 104-二叉树的最大深度
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。解题思路:class Solution { // 方法1:递归 public int maxDepth(TreeNode root) { if(root == null) return 0; return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; }}
2021-07-17 11:19:26
83
原创 LeetCode 110-平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。解题思路:构建递归函数,对于当前遍历到的节点,先递归地判断当前节点的左右子树是否是平衡二叉树,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度,否则返回 -1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。public boolean isBalanced(TreeNode root) { return pr
2021-07-17 10:42:47
126
原创 LeetCode 19-删除链表的倒数第 N 个结点
删除链表的倒数第 N 个结点给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。解题思路:通过双指针定位到需要删除结点的前一个结点。具体流程如下:快指针先走n步,保证两个指针的距离为n快慢指针开始一起走,直到快指针的下一个结点为空删除目标结点class Solution { // 双指针,快指针首先走n步。快慢指针随后一起走 public ListNode removeNthFromEnd(ListNode head, int n) {
2021-07-16 18:49:50
110
原创 智力题-找机器
智力题-找机器十个机器,其中九个机器生产的货物是5g,只有一个机器生产的货物是4g,给你一个称,如何一次找出那个生产4g货物的机器。解题:将10个机器依次进行编号,分别为1-10。1号机器生产1个货物,2号机器生产2个货物,以此类推,10号机器生产10个货物,共计55个货物。假设每个机器生产的货物都是5g,则这55个货物的总重量为275g。因此,275g - 实际的重量 = 机器的编号。原因:假设是n号机器生产的货物为4g,则n号机器总共生产n个货物,即重量减少了ng。...
2021-07-16 18:37:19
727
转载 智力题:抢30
智力题:抢30游戏规则是:第一个人喊 “ 1 ”或 “ 2 ”,第二个人要接着往下喊一个或两个数,然后再轮到第一个人。两人轮流进行下去。最后喊 30 的人获胜。问喊数字的最佳策略。答案:尽量喊3的倍数。解析:倒着看,其实,喊 27 时,就决定胜负了。假设 A 喊了 27,B只能喊 28 或 29 ,下个回合,A 一定可以喊30。也就是说,喊 27 者必胜。再倒着看,其实喊 24 时,就定胜负了。假设 A 喊了 24 ,B 只能喊 25 或 26 ,下个回合 A 一定能喊 27 。由于喊 27 者必
2021-07-16 18:14:03
2907
原创 LeetCode 2-两数相加
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.解题思路:将两个链表看成是相同长度链表的进行遍历,如果一个链表较短则在前面补0。每一位计算的同时需要考虑上一位的进位问题,而当前位计算结束后同样需
2021-07-10 22:19:12
361
2
原创 LeetCode 92-反转链表 II
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表。输入:head = [1,2,3,4,5], left = 2, right = 4输出:[1,4,3,2,5]解题思路:代码:/** * Definition for singly-linked list. * public class ListNode { * int val; *
2021-07-10 22:06:34
135
原创 LeetCode141-环形链表
给定一个链表,判断链表中是否有环。如果链表中存在环,则返回 true。 否则,返回false。解题思路:定义两个指针,快指针和慢指针,均指向链表的头节点。慢指针一次走一步,快指针一次走两步。如果两个指针相遇,表明链表有环,否则无环。代码:/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { *
2021-07-10 21:32:50
91
原创 LeetCode 21-合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。解题思路:类似于归并排序中的merge操作,只不过是在两个链表上进行操作。class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { // 1. 新建虚拟节点,便于后续的操作 ListNode dummy = new ListNode(0); // 2. 新链表中的索引节点
2021-07-10 21:22:14
112
原创 LeetCode 160-相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。解题思路:定义两个指针分别指向两个链表的头部, 首先让两个指针向后移动,让先移动到末尾的指针从另一个链表的头部再次移动,最后如果相遇则为交点。原理:在第一轮移动中恰好抹除了长度差,两个指针等于移动了相同的距离, 有交点就返回, 无交点就是各走了两条指针的长度。/** * Defi
2021-07-09 21:49:45
377
1
原创 LeetCode 206-反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]解题思路:从前向后遍历链表的节点,依次进行反转。代码:class Solution { public ListNode reverseList(ListNode head) { // 1. 新建一个空节点,指向当前链表反转时的下一个节点 ListNode dummy = null; // 2. 当
2021-07-09 20:50:13
166
原创 LeetCode 56-合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例 1:输入:intervals = [[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10],[15,18]]解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].解题思路:排序+合并代码:class Solution {
2021-07-09 19:17:19
146
原创 LeetCode 611-有效三角形的个数
给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。示例 1:输入: [2,2,3,4]输出: 3解释:有效的组合是: 2,3,4 (使用第一个 2)2,3,4 (使用第二个 2)2,2,3解题思路:三条边长从小到大为 a、b、c,当且仅当 a + b > c 这三条边能组成三角形。首先对数组排序。此时,数组中的相对大的值就在数组后面,我们即可固定最长的一条边,二分查找其余的两条边。代码:class Solution { public
2021-07-08 18:10:29
226
原创 LeetCode 448-找到所有数组中消失的数字
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。示例 1:输入:nums = [4,3,2,7,8,2,3,1]输出:[5,6]解题思路:如果没有限制空间复杂度,本题整体不难,我们可以利用HashSet解决。但是如何在不使用额外空间且时间复杂度为 O(n) 的情况下解决这个问题?当前元素是 nums[i],那么我们把第 Math.abs(nums[i]) -
2021-07-08 15:22:34
81
原创 LeetCode 628-三个数的最大乘积
给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。示例 1:输入:nums = [1,2,3]输出:6解题思路:如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同样也为最大乘积。如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。综上,我们在给数组排序后,分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答案。
2021-07-08 14:58:26
105
原创 LeetCode 997-有序数组的平方
给你一个按非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。示例 1:输入:nums = [-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]解题思路:双指针:left 指针指向 nums 数组的开头;right 指针指向 nums 数组的结尾。因为 nums 数组在平方前是有序的,并且 nums 数组的平方的最大值一定是在两端找到的,
2021-07-08 12:27:58
90
原创 LeetCode 48-旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]解题思路:先上下反转,再对角反转,可以实现顺时针 90 度的旋转效果代码:class Solution { public void rotate(int[][]
2021-07-07 15:46:39
97
原创 LeetCode 169-多数元素
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:[3,2,3]输出:3示例 2:输入:[2,2,1,1,1,2,2]输出:2解题思路:遇到相同的就加1,遇到不同的就减1,减到0就重新换个数开始计数,总能找到最终的答案。代码:class Solution { //整体思路:遇到相同的就加1,遇到不同的就减1,减到0就重新换个数开始计数,总能找到最多
2021-07-07 13:55:38
81
原创 LeetCode 31-下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。示例 1:输入:nums = [1,2,3]输出:[1,3,2]解题思路:先找出最大的索引 i 满足 nums[i] < nums[i+1],如果不存在,就翻转整个数组;再找出另一个最大索引 j 满足 nums[j] > nums[i];交换 nums[i] 和 nums[j
2021-07-07 13:44:02
63
原创 LeetCode 54-螺旋矩阵
螺旋矩阵给你一个 m 行 n 列的矩阵 matrix ,请按照顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]解题思路:按边打印思路:定义矩阵的四条边,依次打印上、左、下、右四条边。打印每条边后尝试更新边界,如果更新失败,直接退出。代码:class Solution { public List<Integer> spiralOrder(int[][]
2021-07-01 13:37:26
78
原创 LeetCode 88-合并两个有序数组
合并两个有序数组给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。示例 1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]解题思路:双指针题目给出的
2021-07-01 12:29:20
108
原创 leetcode-3 无重复字符的最长子串
无重复字符的最长子串给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例 1:输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。解题1:两次遍历思路:总体思路是利用滑动窗口解决。具体是通过数组记录每个字符最后出现的索引位置,然后遍历字符串,判断每一个字符上次出现的位置,更新左边界以及最大值。代码:public int lengthOfLongestSubstring(String s) { //
2021-06-30 22:15:29
117
原创 leetcode 240 / 剑指Offer 04 二维数组中的查找
剑指 Offer 04. 二维数组中的查找在一个 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, 3
2021-06-30 09:57:44
81
原创 项目-26-热帖排行
热帖排行实现,在发帖、点赞、加精时将发生变化的帖子存入Redis中。再通过定时任务,每隔一定的时间,计算帖子的分数进行更新新建PostScoreRefreshJob类进行处理1.RedisKeyUtil//帖子分数public static String getPostScoreKey(){ return PREFIX_POST + SPLIT + "score";}2.处理ControllerDiscussPostController //发布帖子 @Request
2021-06-28 18:44:34
334
原创 项目-25-初始任务执行和调度
初始任务执行和调度我们需要定时计算各帖子的分数,清除临时文件等,这就需要任务调度的组件。JDK线程池ExecutorService:普通的线程池ScheduledExecutorService:可以执行定时任务(分布式环境可能出问题)Spring 线程池ThreadPoolTaskExecutor:普通的线程池ThreadPoolTaskScheduler:可以执行定时任务(分布式环境可能出问题)分布式定时任务Spring Quartz(将数据存储到数据库,分布式时可以共享数据)
2021-06-28 18:43:08
212
1
原创 项目-24-网站数据统计
网站数据统计1.UV(Unique Visitor)独立访客,需通过用户IP去重统计数据。不需要登录每次访问都要进行统计。HyperLoglog:性能好,且存储空间小。2.DAU(Daily Active User)日活跃用户,需通过用户ID去重统计数据。需要登录访问过一次,则认为其为活跃。Bitmap:性能好、且可以统计精确的结果。通过用户ID作为Bitmap的索引,1表示今天为活跃,0表示今天不活跃1.RedisKeyUtil//单日UV:某一天的数据public sta
2021-06-27 17:59:24
370
原创 项目-23-Redis高级数据类型
Redis高级数据类型1. HyperLoglog 超级日志采用一种基数算法,用于完成独立总数的统计。[统计UV]占据空间小,无论统计多少个数据,只占12K的内存空间。不精确的统计算法,标准误差为0.81%。2. Bitmap 位图不是一种独立的数据结构,实际上就是字符串。支持按位存取数据,可以将其看成是byte数组。适合存储大量的连续的数据的布尔值。[统计签到]3. 实例//统计20万个重复数据的独立总数@Testpublic void testHyperLogLog(){
2021-06-27 17:57:06
200
原创 项目-22-置顶、加精、删除
置顶、加精、删除1.导包thymeleaf和springsecurity5的整合 <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> </dependency>功能实现点击“置顶”、“加精”、“删除”,修改帖子的状态在DiscussPo
2021-06-27 17:55:22
158
原创 项目-21-Spring Security
Spring Security介绍简介Spring Security是一个专注与为Java应用程序提供身份认证和授权的框架,它的强大之处在于它可以轻松扩展以满足自定义的需求。特征对身份的认证和授权提供全面的、可扩展的支持。防止各种攻击,如会话固定攻击、点击劫持、csrf攻击等。支持与Servelt API、Spring MVC等Web技术集成。原理底层使用Filter(javaEE标准)进行拦截Filter–>DispatchServlet–>Inter
2021-06-27 17:53:24
213
2
原创 项目-20-开发社区搜索功能
开发社区搜索功能搜索服务:将帖子保存至Elasticsearch服务器。从Elasticsearch服务器删除帖子。从Elasticsearch服务器搜索帖子。发布事件:发布帖子时,将帖子异步的提交到Elasticsearch服务器。增加评论时,将帖子异步的提交到Elasticsearch服务器。在消费组件中增加一个方法,消费帖子发布事件。显示结果:在控制器中处理搜索请求,在HTML上显示搜索结果。1.ElasticsearchServiceimp
2021-06-25 14:54:45
286
原创 项目-19-初识Elasticsearch
1. 初识ElasticsearchElasticsearch入门一个分布式的、Restful风格的搜索引擎。支持对各种类型的数据的检索。搜索速度快,可以提供实时的搜索服务。便于水平扩展,每秒可以处理PB级海量数据。Elasticsearch术语 :索引、类型、文档、字段。集群、节点、分片、副本。Elasticsearch与数据库的对比:Elasticsearch数据库索引database类型table文档一行数据字段一列数据
2021-06-25 14:52:14
148
原创 项目-18-显示系统通知
显示系统通知通知列表:——显示评论、点赞、关注三种类型的通知通知详情 :——分页显示某一类主题所包含的通知未读消息 :——在页面头部显示所有的未读消息数量1.MessageMapper,添加几个查询的方法@Mapperpublic interface MessageMapper { // 查询某个主题下最新的通知 Message selectLatestNotice(int userId, String topic); // 查询某个主题所包含的通知数量 int
2021-06-25 14:42:36
244
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人