- 博客(81)
- 问答 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 基于raft协议的P2P下载器
一个mini项目加深对分布式协议的理解,以及对并发编程的理解通过的方式进行用户加速,采用协议在一个用户group中选举下载服务的管理者,在第三方服务器Tracker的组分配中、以及Leader 的任务分配中进行负载均衡。
2022-10-12 20:11:50
637
原创 ReentrantLock与ReentrantReadWirteLock 原理
加锁解锁流程先从构造器开始看,默认为非公平锁实现没有竞争时第一个竞争出现时Thread-1 执行了当前线程进入 acquireQueued 逻辑shouldParkAfterFailedAcquire 执行完毕回到 acquireQueued ,再次 tryAcquire 尝试获取锁,当然这时state 仍为 1,失败trueThread-0 释放锁,进入 tryRelease 流程,如果成功当前队列不为 null,并且 head 的 waitStatus = -1,进入 unparkSuc
2022-11-03 16:35:36
530
1
原创 Java并发框架-AQS原理
全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架特点:用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁。
2022-11-03 16:22:39
205
原创 JUC笔记(五) --- 无锁共享模型
而LongAdder则有两个值用于累加,一个是base,它的作用类似于AtomicInteger里面的value,在没有竞争的情况不会用到cells数组,这时使用base做累加,有了竞争后。设想如果我们有个long类型的变量a,它不是数组的一部分,而是一个单独的变量,并且还有另外一个long类型的变量b紧挨着它,那么当加载a的时候将免费加载b。当CPU执行运算的时候,它先去L1查找所需的数据,再去L2,然后L3,最后如果这些缓存中都没有,所需的数据就要去主内存拿。,因为其它缓存中的a不是最新值了。
2022-11-03 16:17:19
348
原创 JUC笔记(四) --- 内存共享模型
Java内存模型、可见性、volatile解析、有序性、指令重排、深入了解synchronized和volatile的区别
2022-11-01 16:30:37
220
原创 JUC笔记(二) --- Java线程
如果在构造 Thread 对象时传递了 Runnable 参数,则线程启动后会调用 Runnable 中的 run 方法,否则默。当 Context Switch 发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念。默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守。因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码。护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。
2022-10-27 20:18:12
466
原创 JUC笔记(一) --- 计算机基础
指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。相同计算机进程间通信?好像是信号量、管道等,还没具体用过。不同计算机进程通信:如http协议。进程可以认为是一个应用启动。将代码从磁盘加载到内存。
2022-10-27 20:09:58
512
2
原创 Java在线考试(答案)cqupt
每道题答案调用函数T1、T2import java.util.Scanner;public class Main{ static int gcd(int a , int b){ return b>0 ? gcd(b,a%b):a; } public static void main(String[] args) { // 在这里调用T1 、 T2 答案 } static void T1(){ Sc...
2022-05-15 08:49:50
642
2
原创 CQUPT Java平时作业08
【问题描述】从标准输入中输入一个小数,编写程序将其转换成相应的分数显示,即转换为几又几分之几。要求:1、输入的小数包括整数部分、小数点和小数部分;整数部分和小数部分最多有7位数字;整数部分可以为0,若整数部分大于等于1,则其最高位不为0;小数部分的末尾数字不为零。2、输出的分数应为最简分数,由三个数字组成:第一个数字代表整数部分(若分数小于1,则为0,否则输出的整数的最高位不为0),第二个数字代表分子,第三个数字代表分母,分子比分母小且不能再约分。【输入形式】从标准输入中输入一个小数后打回车。
2022-05-13 14:57:51
427
原创 CQUPT Java 随堂测试1
选择题每个人的题 都不一样我就不贴了第一题:约瑟夫环第二题:九九乘法表import java.util.*;public class Main { static int[] f; static int[] a; public static void main(String[] args) { // 在这里调用对应函数 } public static void T1(){ // di yiti Scanner in = new .
2022-04-29 14:50:05
1324
原创 LCP 57. 打地鼠
LCP 57. 打地鼠思路:从最后一个出现位置进行往前递推。f[i][x][y]记录第i次出现时位置的(x,y)能打老鼠到的个数f[i][x][y]记录第i次出现时位置的(x,y)能打老鼠到的个数f[i][x][y]记录第i次出现时位置的(x,y)能打老鼠到的个数利用当前时间和上个时间的差值diff,进行判断能否转移abs(xi−xi+1)+abs(yi−yi+1)<=diffabs(x_i - x_{i+1}) + abs(y_{i} - y_{i+1}) <= diffa
2022-04-23 22:16:45
291
原创 LeetCodeCup 2. 烹饪料理
思路:用状态压缩举出每一种状态,在判断是否可以满足大于limit的目标,满足则记录当前选取的cookbooks 的ans。eg :共三本书。选取第一本第二本 :i = 3 。 二进制表示则为 0 1 1小菜鸡一个,做了两个来小时就写了三道。。。日了x了。。最后一道好像是拓扑还是啥来着,没怎么用过挺可惜的。class Solution { static int[][][][]f; public int perfectMenu(int[] materials, int[][] co
2022-04-16 18:43:41
644
原创 LeetCode 780. 到达终点
780. 到达终点思路:当从起点推向终点,每次会有两个状态 (x+y,y) && (x,x+y) ; 这样会超时而逆向思维:从终点向起点进行推进,每次只有一个状态(|x-y|,y) || (x,|y-x|); 因为每次的x,y都必须大于等于0先递推到 tx, ty 两个都等于sx ,sy , 或者 其中一个相等1)当两个相等 说明可以递推得到起点返回trueps:我自己做的时候没有想到对ty-sy 模 tx 可以判断,这里借鉴的答案。2)当有一个值相等,递推另外一个值
2022-04-14 19:32:23
217
原创 蓝桥杯 : 分巧克力
蓝桥杯 : 分巧克力【第八届】【省赛】【B组】分巧克力【第八届】【省赛】【B组】思路:每次枚举一种长度为x 的正方形。再带入每个矩形中计算每个矩形可以得到的最大块数cnt+=(h/x)∗(l/x)cnt += (h/x) * (l/x)cnt+=(h/x)∗(l/x)复杂度分析: 如果两层循环枚举时间复杂度为 10^10 > 10^8 会超时。为减少复杂度,可以使用二分查找代替长度x的枚举即:在读入巧克力数据时,记录每块巧克力的边长最短的边 的最大值 max , 这样可以
2022-04-08 20:09:11
291
原创 剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点思路:先遍历一次链表,获得它的长度。再计算需要访问几个节点才能找到倒数第k个节点/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode g
2022-04-08 13:16:57
251
原创 剑指 Offer 18. 删除链表的节点
剑指 Offer 18. 删除链表的节点思路:需要保存上一个节点,当当前节点的值是需要删除的值,直接将上一个节点的next指针指向当前节点的下一个指针指向的节点。定义一个cur 指向当前节点pre 指向前一个节点/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } *
2022-04-08 13:12:42
267
原创 LeetCode 429. N 叉树的层序遍历
429. N 叉树的层序遍历思路: 图的层次遍历时,一般用队列进行逐层遍历。当需要记录当前层有哪些元素时,可以使用一层循环访问当前队列的元素。看代码应该一下就懂了/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() {} public Node(int _val) { val = _val;
2022-04-08 13:08:30
452
原创 线段树模板题:POJ 3468 a simple problem with integers Java 模板
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.*;class Node{ int left; int right; long value; long add;}public class Main { static int[] w ; static Node[] tree; .
2022-04-07 15:26:10
83
原创 剑指 Offer II 039. 直方图最大矩形面积
剑指 Offer II 039. 直方图最大矩形面积leetcode 上好像可以直接两重循环查找不会超时。做cf的时候做到了相似题 顺手把leetcode这道题写了。一下给出单调栈的优化代码思路:单调栈进行存储每个加入元素的val,和index 。 当遇到比它小的值直接弹出,再贪心记录 面积1.当当前遍历值 a[i] >= 栈顶元素,直接将<a[i],i> 压入栈当当前遍历值 a[i] < 栈顶元素时,将栈顶元素弹出,并记录:ans=max(ans,val∗(i
2022-04-07 15:21:47
916
原创 剑指 Offer 47. 礼物的最大价值
剑指 Offer 47. 礼物的最大价值思路:和最短路径 等类似。每个位置的状态有左边的位置和上边的位置转移而来,再加上自己的值f[i][j]=max(f[i−1][j],f[i][j−1])+w(i,j)f[i][j] = max(f[i-1][j],f[i][j-1]) + w(i,j)f[i][j]=max(f[i−1][j],f[i][j−1])+w(i,j) class Solution { public int maxValue(int[][] grid) {
2022-04-07 15:12:03
87
原创 剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和思路:存储cur存储当前连续子数组的值。单次表里1)当它小于零时已经没有必要存储当前的值了,设为零。2)每次存储ans的最大值ans=max(cur,ans)ans = max(cur,ans)ans=max(cur,ans)class Solution { public int maxSubArray(int[] nums) { int ans = -0x3f3f3f3f, cur = 0 ; for
2022-04-07 15:08:14
81
原创 LeetCode 310. 最小高度树
310. 最小高度树思路:找到树中距离最长的两个点,最小高度的根一定在中点。1) 任意选取一个点i,选取最远的作为下一次查找最远距离的点 j2)从j出发 选取距离最远的 k , 最远距离则为 j - k 。3)记录j -> k 的路径 ,再选取中点即可。ps:路过点数为偶则有两个证明我也不太会写,离散好像讲过,记得好像有这么一回事。建议随便画一棵树任选一个节点 试试class Solution { static int idx ; // 节点索引 static int[]
2022-04-07 15:04:23
185
原创 剑指 Offer 48. 最长不含重复字符的子字符串
剑指 Offer 48. 最长不含重复字符的子字符串思路:hash表+dp 进行更新每一次的最大值1)遍历字符串2) 取出当前遍历字符 之前 出现的位置 , 若未出现 则 为-13) 状态转移: Hash(j) 存储的是当前字符最近出现的indexf[i]=i−Hash(j)>f[i−1]?f[i−1]+1:i−Hash(j)f[i] = i - Hash(j) > f[i-1] ? f[i-1] + 1 : i - Hash(j)f[i]=i−Hash(j)>f[i−1
2022-04-07 14:55:27
125
原创 剑指 Offer 46. 把数字翻译成字符串
剑指 Offer 46. 把数字翻译成字符串思路:每个位置与的状态有两种1: 与前一个数字组合 >= 10 && <26:f[i]=f[i−1]+f[i−2]f[i] = f[i-1] + f[i-2]f[i]=f[i−1]+f[i−2]2: 与前一个数字无法组合时f[i]=f[i−1]f[i] = f[i-1]f[i]=f[i−1]class Solution { public int translateNum(int num) {
2022-04-07 14:44:05
111
原创 LeetCode 796. 旋转字符串
796. 旋转字符串思路:直接将两串s拼接起来可以表示任意旋转状态,再判断是否还有字串即可class Solution { public boolean rotateString(String s, String goal) { return s.length() == goal.length() && (s + s).contains(goal); }}...
2022-04-07 14:40:21
74
原创 剑指 Offer 63. 股票的最大利润
剑指 Offer 63. 股票的最大利润思路:是用贪心找到利润最大值。如果需要dp解法可以看股票类型详解:股票题型详解class Solution { public int maxProfit(int[] prices) { if(prices.length == 0 || prices.length == 1 ) return 0; int ans = 0 ; int min = prices[0]; for(int i = 1
2022-04-05 22:07:08
308
原创 剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 10- II. 青蛙跳台阶问题思路:简单的dp问题。第i个位置从i-1的位置和i-2的位置转移而来f[i]=f[i−1]+f[i−2]f[i] = f[i-1] + f[i-2]f[i]=f[i−1]+f[i−2]class Solution { public int numWays(int n) { int[] f = new int[n+1]; f[0] = 1; if(n < 1) return f[0];
2022-04-05 22:04:03
181
原创 剑指 Offer 10- I. 斐波那契数列
剑指 Offer 10- I. 斐波那契数列思路:直接枚举,注意要模1000000007,不然会waclass Solution { public int fib(int n) { int[] f = new int[n+1]; if(n <= 0) return 0; f[0] = 0; f[1] = 1; for(int i = 2 ; i <= n ; i++){ f[i]
2022-04-05 22:00:36
168
原创 LeetCode 762. 二进制表示中质数个计算置位
762. 二进制表示中质数个计算置位思路 : 直接转化为二进制进行统计计算置位,在判断计算置位是不是质数class Solution { public int countPrimeSetBits(int left, int right) { int ans = 0; for(int i = left ; i <= right ; i++){ int j = i; int cnt= 0 ;
2022-04-05 21:57:16
285
原创 CQUPT Java平时作业05
选择题答案与代码如下,提交时直接在主函数中调用即可import java.util.Scanner;class Retangle { float length; float width; public Retangle(float length, float width) { this.length = length; this.width = width; } public float getArea() {
2022-04-05 19:15:55
638
原创 剑指 Offer 26. 树的子结构
剑指 Offer 26. 树的子结构递归实现子树查询,应该挺好理解的叭class Solution { public boolean isSubStructure(TreeNode A, TreeNode B) { if(B==null || A== null) return false; return isSubStructure(A.left , B) || isSubStructure(A.right,B) || dfs(A,B); }
2022-04-04 22:59:49
98
原创 LeetCode 307. 区域和检索 - 数组可修改
307. 区域和检索 - 数组可修改方法一:直接数组遍历进行修改与查找方法二:线段树,以下为线段树代码 主要是为了练习一下线段树模板class NumArray { int N = 30001*4; int[] arr = new int[N]; int[] val = new int[N]; // 记录值 int[] left = new int[N]; // 左节点 int[] right = new int[N]; // 右节点
2022-04-04 22:53:14
1479
原创 剑指 Offer 32 - I. 从上到下打印二叉树
剑指 Offer 32 - I. 从上到下打印二叉树队列进行树的层次遍历/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public int[] levelOrd
2022-04-04 22:43:34
674
原创 剑指 Offer 50. 第一个只出现一次的字符
剑指 Offer 50. 第一个只出现一次的字符思路:直接建表 在遍历查找class Solution { public char firstUniqChar(String s) { int[] f = new int[26]; int idx ; for(int i = 0 ; i < s.length() ; i++){ idx = s.charAt(i) - 'a'; f[idx]++;
2022-04-04 22:40:17
181
原创 LeetCode154. 寻找旋转排序数组中的最小值 II
154. 寻找旋转排序数组中的最小值 II此题与 该题类似:剑指 Offer 11. 旋转数组的最小数字区别在于这个数组旋转多次 ,但任然可以与最右侧值相比较,判断条件相同,不需要在意做半段或者右半段class Solution { public int findMin(int[] nums) { return binarySearch(nums,0,nums.length-1); } public int binarySearch(int[] a , int
2022-04-04 22:37:34
122
原创 剑指 Offer 11. 旋转数组的最小数字
剑指 Offer 11. 旋转数组的最小数字旋转之后分为两段 ,其中两端仍然按照排列顺序。最小段总在右边,所以我们将中点值与右端点进行比较。情况分为三种:1) 当查找mid 在 第一段递增最高端 也就是 **arr[mid] > arr[right]**时 : 往右查找。2 ) 当**arr[mid] < arr[right]**时 证明已经在右侧最小段3) 当**arr[mid] =arr[right]**时 在右半段,此时需要往左边进行二分查询。class Solution
2022-04-04 22:29:17
317
原创 剑指 Offer 04. 二维数组中的查找
剑指 Offer 04. 二维数组中的查找思路:直接在每一层中通过二分查找进行寻找,可以在寻找前进行判断首和尾是否在查找区间内class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { if(matrix.length==0 || matrix[0].length == 0) return false; for(int i = 0 ; i < matri
2022-04-04 18:10:17
294
求1000以内n的阶乘
2022-04-03
TA创建的收藏夹 TA关注的收藏夹
TA关注的人