自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JAVASE思维导图(基础部分)

JAVASE思维导图(基础部分)总结了JAVASE的基础部分,主体五部分1、 JAVA特点2、 JAVA数据运算与流控制3、 类、包、接口4、 JAVA语言的深入理解5、 异常处理可能有些知识点太过赘述,烦请谅解如下:...

2020-08-17 22:06:36 352

原创 CSAPP--ShellLab

ShellLab一、 Lab介绍CSAPP的ShellLab是实现一个自己的shell程序,完成之后可以熟练掌握UNIX关于进程的系统调用(例如fork、waitpid等),熟悉Linux的信号机制,而且这个Lab非常有趣。二、 Lab实现实现这个Lab主要是完成以下几个函数的编写:eval实现void eval(char *cmdline) { char *argv[MAXARGS]; char buf[MAXLINE]; int bg; // Should the

2021-11-27 10:21:03 582

原创 JVM之内存与垃圾回收——本地方法接口

本地方法接口什么是本地方法?简单地讲,一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,例如C。为什么要使用Native Method?Java使用起来很方便,然而有些层次的任务用Java实现起来不容易,或者我们对程序的效率很在意时,问题就来了。有时Java应用需要与Java外面的环境进行交互,这是本地方法存在的主要原因。目前本地方法接口使用已经越来越少了,除非是与硬件有关的应用。..

2021-11-15 21:04:09 299

原创 JVM之内存与垃圾回收——虚拟机栈

虚拟机栈1、虚拟机栈概述内存中的堆与栈栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪。虚拟机栈基本内容Java虚拟机栈,早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个一个的栈帧,对应着一次次的Java方法调用。Java虚拟机栈是线程私有的。Java虚拟机栈的生命周期和线程一致。Java虚拟机栈的作用:主管Java程序的运行,它保存方法的局部变量(8种基本数据类型、引用类

2021-11-15 20:38:07 320

原创 Algorithm——Trie树

字典树(Trie树)的应用字典树的定义字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。字典树的用处说完了字典树的定义之后,我们来了解一下大名鼎鼎的字典树能用来解决什么问题,请大家先想一下如果我们想要实现这样一个功能:插入大量字符串,然后查找某些字符串是否在刚才插入的字符串序列中。我想大部分同学首先想到的就是用一个哈希表来存储之前插入的字符串,然后再在之前的哈希表里面查找是否

2021-11-14 20:06:01 235

原创 JVM之内存与垃圾回收——程序计数器

程序计数器一、程序计数器介绍JVM中的程序计数器(Program Counter Register,也叫PC寄存器)是对物理PC寄存器的一种抽象模拟。程序计数器的作用程序计数器用来存储指向下一条指令的地址,执行引擎通过这个地址读取下一条指令。程序计数器占用很小的一块内存空间,几乎可以忽略不计。在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,其生命周期与线程的生命周期保持一致。任何时间一个线程只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的Java

2021-11-03 20:42:18 156

原创 JVM之内存与垃圾回收——运行时数据区概述及线程

运行时数据区概述及线程一、运行时数据区概述内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。HotSpot的运行时数据区上图中红色的方法区和红色的堆与JVM共存亡,也就是与进程共存亡,由进制的所有线程共享。灰色的程序计数器、本地方法栈、虚拟机栈与线程共存亡,也就是说每个线程有独立的程序计数器、本地方法

2021-11-03 19:23:57 125

原创 JVM之内存与垃圾回收——类加载子系统

类加载子系统一、内存结构概述要想实现一个Java虚拟机,最基本的是类加载器和执行引擎。二、类加载器与类加载过程类加载子系统的作用类加载子系统负责从文件系统或者网络中加载Class文件,Class文件在文件开头有特定的文件标识(检验这个标识由链接阶段的验证阶段完成)。类加载子系统只负责class文件的加载,至于它是否可以运行,则由执行引擎决定。类加载子系统加载完成之后,将加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字

2021-11-02 22:37:49 80

原创 JVM之内存与垃圾回收——JVM与Java体系结构

JVM与Java体系结构一、前言实际开发中可能遇到的关于JVM的问题为什么学JVM面试都会问追求极客精神中高级Java程序员必备,项目管理,调优需要二、JVM参考书目Oracle官方JVM规范中文版Java虚拟机规范(JDK8)《深入理解Java虚拟机》《自己动手写Java虚拟机》三、Java语言与JVM简介Java是目前应用最广泛的软件开发平台之一。随着Java以及Java社区的不断壮大,Java不再是简简单单的一门计算机语言了,它更是一个平台、一种文化、一个社区。J

2021-11-02 16:29:01 164

原创 Algorithm——高楼扔鸡蛋

问题描述高楼扔鸡蛋问题是一道经典的动态规划问题,题目如下:给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。请

2021-10-31 12:56:30 301

原创 CSAPP--BombLab

BombLab一、 Lab介绍在这里首先给出BombLab的官网地址:http://csapp.cs.cmu.edu/3e/labs.html![csapp](https://img-blog.csdnimg.cn/c71b9b7617104b42b5c48acf56319653.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01BSUhDQk

2021-08-23 18:38:17 1675

原创 LeetCode每日一题-2021/07/04-错误的集合

错误的集合–java–排序思路:这道题很简单,就是找出一个序列中少了的一个元素和重复了的一个元素。首先我们先讲解求重复元素的方法,有两种方式。一是将序列从小到大排序,比较当前元素与前一个元素的值来寻找重复元素。二是利用哈希表来寻找重复元素。接着我们讲解寻找缺少元素的方法。求解缺少元素可以利用正常序列的和减去该序列除了重复元素的和。由于重复元素我们已经求过了,所以只需利用n*n+1求出正常序列的和就可。代码:class Solution { public int[] findErrorNum.

2021-07-04 15:10:49 87 1

原创 LeetCode每日一题-2021/07/03-根据字符出现频率排序

代码:class Solution { public String frequencySort(String s) { Map<Character,Integer> map = new HashMap<>(); for( Character ch : s.toCharArray() ){ map.put(ch,map.getOrDefault(ch,0) + 1); } Charac.

2021-07-03 22:28:08 101

原创 LeetCode每日一题-2021/07/02-雪糕的最大数量

雪糕的最大数量–java–排序+贪心思路:这道题很明显可以看出来,是一道贪心求解的问题,但前提是先对其进行排序。代码:class Solution { // 贪心法 public int maxIceCream(int[] costs, int coins) { int res = 0; Arrays.sort(costs); for( int i = 0; i < costs.length; ++i ){ .

2021-07-02 07:50:38 79

原创 LeetCode每日一题-2021/07/01-传递信息

传递信息–java–递归大概有一个礼拜没有更新题解了,今天百忙之中抽点时间更新一下。思路:这道题,乍一看会觉得不好下手,那是因为你没有理解递归思想的核心。递归思想对于学习算法来说有多重要就不用多说了吧。理解递归的两个要素对于理解递归思想来说是相当重要的,即递归的结束条件和递推方程,每次在使用递归解题时,只需要想到这两条,就会使问题简单许多了。代码:class Solution { // 递归思想 public int numWays(int n, int[][] relation.

2021-07-01 19:23:02 89

原创 LeetCode每日一题-2021/06/23-二进制中1的个数

二进制中1的个数–位运算–C++思路:这道题求的是给定数字的二进制中1的个数,容易想到的一种解法是循环遍历整个数字的二进制最后一位,如果该数字是2的倍数,则说明是0,不用将结果+1,如果不是2的倍数,则说明是1,将结果+1,最后将数字右移一位,直到数字的所有二进制位全是0,即数字为0时结束循环。代码:class Solution {public: int hammingWeight(uint32_t n) { int cnt = 0; while( n !.

2021-06-23 13:22:38 53

原创 LeetCode每日一题-2021/06/22-字符串的排列

字符串的排列–java–回溯思路:这道题一看就是一道典型的回溯问题,求出给定字符串的所有排列。相对于求所有子集的问题,这道题只需要求出长度为原始字符串长度的子集即可。直接利用dfs模板来做。代码:class Solution { private Set<String> res = new HashSet<>(); public String[] permutation(String s) { List<Character> lis.

2021-06-22 22:39:15 48

原创 LeetCode每日一题-2021/06/21-二进制手表

二进制手表–java–枚举法思路:可以枚举所有时刻的时分二进制之和,如果得到的结果与传入参数相等,则该时刻符合题目要求,将其时分的字符串表示加入结果集中,枚举完成之后,返回结果集。代码:class Solution { public List<String> readBinaryWatch(int turnedOn) { List<String> res = new LinkedList<>(); for( int i =.

2021-06-21 21:34:59 129 2

原创 LeetCode每日一题-2021/06/19-串联字符串的最大长度

串联字符串的最大长度–java–BFS思路:这道题可以使用BFS来做,前提是需要知道节点在集合中的位置。代码:```javaclass Solution { public int maxLength(List<String> arr) { // bfs Queue<Map<String,Integer>> queue = new LinkedList<Map<String,Integer>>().

2021-06-19 21:41:13 85

原创 LeetCode每日一题-2021/06/16-石子游戏

石子游戏–java–dfs思路:这道题,一看题解就觉得自己像个弱智。呜呜呜~~~。DP解法先放下,只有dfs解法。代码:class Solution { private boolean res; // dfs public boolean stoneGame(int[] piles) { dfs(true,0,piles.length - 1,piles,0); return res; } public vo.

2021-06-16 20:50:11 52

原创 LeetCode每日一题-2021/06/15-山脉数组的峰顶索引

山脉数组的封顶索引–java–二分法思路:这道题最容易想到的就是枚举每个数字,而要想将时间复杂度降为O(logN),可以使用二分的思想(利用arr[0] < arr[1] < … arr[i-1] < arr[i] >arr[i+1] > … > arr[arr.length - 1])。二分法其实就是在相对有序的序列中找到目标值,在这道题中其实就是找到那个比左右两个数字都大的数。代码:class Solution { public int pea.

2021-06-15 21:25:09 1161 1

原创 LeetCode每日一题-2021/06/14-猜数字大小

猜数字大小–java–二分法思路:这道题很明显的就可以看出是二分问题,废话不用多说,直接套二分模板。代码:/** * Forward declaration of guess API. * @param num your guess * @return -1 if num is lower than the guess number * 1 if num is higher than the guess number * o.

2021-06-14 13:33:00 82

原创 LeetCode每日一题-2021/06/13-第一个错误的版本

第一个错误的版本–java–二分思路:这道题最容易想到的就是从1开始遍历到n,第一次调用提供的API结果为true的数即为答案。然而,顺序遍历有序序列,一般也可以用二分思想来做,并且可以将时间复杂度降为O(logN)。目标是找到第一次调用提供的API结果为true的数,可利用二分思想,首先将 left 指向1,而 right 指向 n ,每次计算 left 和 right 的中间值 mid 对应的API是否为 true ,如果为 true ,则将 mid 赋值给 right ,如果为 false ,将m.

2021-06-13 15:07:33 83

原创 LeetCode每日一题-2021/06/11-完全平方数

完全平方数–java–BFS思路:这道题官方题解给的是dp和数学解法,这两天基本被DP搞得心态崩了。这道题我想到的是BFS暴力,也是没谁了。过几天必须专门把DP弄明白了。暴力解法,BFS模板直接用就好,没什么特别难理解的地方。代码:class Solution { public int numSquares(int n) { List<Integer> list = new LinkedList<>(); for( int i =.

2021-06-11 22:02:16 115 2

原创 LeetCode每日一题-2021/06/07-目标和

目标和–java–回溯思路:这道题很容易想到的就是回溯算法,虽然说时间复杂度高,但ac还是没问题的。同样可以用dp来做,这里先挖下个坑,等到复习dp的时候,再将动态规划做法加入。代码:class Solution { public int findTargetSumWays(int[] nums, int target) { return dfs(nums,target,0); } int dfs(int[] nums, int target, i

2021-06-07 21:54:47 40

原创 LeetCode每日一题-2021/06/05-移除链表元素

移除链表元素思路:这道题很容易想到的一个思路是开辟一片新的空间,然后遍历原数组,将符合条件的加入新链表,这样做空间复杂度为O(n)。第二种方法是在原地修改链表,空间复杂度为O(1)。需要注意的是保证注意最后一个节点值为val的情况。具体操作流程见下图:代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListN

2021-06-05 23:26:46 83 1

原创 LeetCode每日一题-2021/06/04-相交链表

相交链表–java–哈希表思路:这道题,很容易想到的就是双循环暴力来做,也是一道很少有的LeetCode暴力不超时的题第二种思路是使用哈希表来做,先将A遍历,放入哈希表中,然后再遍历B,如果B中的元素在哈希表中存在,则返回该元素,否则返回null代码:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(.

2021-06-04 16:52:17 60

原创 LeetCode每日一题-2021/06/03-连续数组

连续数组–java–前缀和思路:这道题的暴力解法应该是很容易想到的,使用两层循环,很容易求解。但超时是肯定的。比较难想的是第二种解法,使用前缀和+哈希表。这个想法最关键的地方在于想到前缀和主要用于求连续子数组和,能想到这一点就很好做了,只需把0换成-1,然后考虑前缀和值相等的情况即可。class Solution { // public int findMaxLength(int[] nums) { // int max = 0; // for( int.

2021-06-04 12:58:37 53

原创 LeetCode每日一题-2020/06/02-连续的子数组和

连续的子数组和–java–前缀和+同余定理思路:这道题最容易想到的是时间复杂度为O(n ^ 2)的暴力法,但只可以通过92个用例,第93个用例无法通过,现在连打表都无法通过了。数论学的好的朋友可能会想到求解这道题的关键,即利用同余定理。同余定理简单解释:(a - b) % c == 0 等价于 a % c == b % c知道这个,这道题就变得非常简单了,(arr[j] - arr[i]) % k == 0 就可以转换为 arr[j] % k == arr[i] % k利用哈希表就可以使用o

2021-06-02 21:19:27 49

原创 LeetCode每日一题-2021/05/31-4的幂

4的幂–位运算–C++同样是一道考察位运算的题,该题有多种解法,在这里列出两种:一种是使用四进制来求解,另一种是使用取模3来求解方法一:主要思路:要求一个数是不是4的幂,只需将这个数用4进制表示,看表示结果是不是**1000…**这种形式即可。如果是这种格式,说明该数是4的幂。如果不是这种格式,比如123,说明该数不是4的幂方法二:主要思路:一个数要想是4的幂,首先它必须得是2的幂。所以首先判断该数是否是2的幂,如果不是2的幂,肯定也是不会是4的幂。然后再判断是否是4的幂,有两种情况:1

2021-05-31 18:04:58 47

原创 LeetCode每日一题-2021/05/30-二的幂

二的幂思路:这道题还是比较简单的,首先分类讨论,如果一个数是负数或0,那么它肯定不是二的幂。如果一个数是正数,可以先列出它的二进制表示,如果二进制表示只有一个1,那么该数就是二的幂,如果二进制表示没有1或有多个1,则不是二的幂例如:8的二进制表示为1000,只有一个1,所以它是二的幂9的二进制表示为1001,有多个1,所以它不是二的幂代码:class Solution {public: bool isPowerOfTwo(int n) { if( n <=

2021-05-30 11:48:34 51

原创 LeetCode每日一题-2021/05/28-汉明距离总和

汉明距离总和–java–位运算这道题很容易想到暴力解法,但就算在暴力解法的前提下加上备忘录,还是会超时,所以应该需要更高效的算法来解决。其实通过观察规律很容易可以得到结论:例如:[4,14,2]二进制形式为:0 1 0 01 1 1 00 0 1 0最终结果为:第一列上0的个数乘第一列上1的个数 + 第二列上0的个数乘第二列上1的个数 + 第三列上0的个数乘第三列上1的个数 + 第四列上0的个数乘第四列上1的个数所以最终结果为 2 * 1 + 1 * 2 + 1 * 2 + 3 * 0

2021-05-28 17:35:56 74

原创 LeetCode每日一题-2021/05/27-汉明距离

汉明距离–位运算–C++汉明距离汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。 对两个字符串进行异或运算,并统计结果为1的个数,那么这个数就是汉明距离。下面来看这道求汉明距离的题:看题很容易理解,汉明距离其实就是统计两个数的二进制表示有几位不同(也就是求其异或值有几位1),很容易就得到了结果。代码如下:class Solution {public: int hammingDi

2021-05-27 19:10:05 97

原创 LeetCode每日一题-2021/05/21-不相交的线

题目如下:在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:nums1[i] == nums2[j]且绘制的直线不与任何其他连线(非水平线)相交。请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。以这种方法绘制线条,并返回可以绘制的最大连线数。仔细读题,会发现一个特别神奇的东西,这道题其实就是最长公共子序列问题换了一种问法,其实换汤不换药,看到这里是不是

2021-05-21 15:06:30 142

原创 Leetcode每日一题-2021/05/20-前K个高频单词

Leetcode每日一题-2021/05/20-前K个高频单词前K个高频单词方法一:哈希表+排序思路:首先将字符串的出现次数存储在哈希表中(字符串作key,次数作value),然后根据出现次数将其进行排序(从大到小),如果出现次数一样,则按字典序排序。最后返回排序后的前K个字符。代码如下:class Solution { // 哈希表+排序 public List<String> topKFrequent(String[] words, int k) {

2021-05-20 21:21:20 49

原创 LeetCode每日一题-2021/05/19-找出第k大的异或坐标值

找出第k大的异或坐标值–java–动态规划本题是一道考察***异或性质***以及***简单的动态规划思想***的题目本题思路:读题之后,相信很多同学都可以很容易的想到本题的状态转移方程:即dp[i][j] = dp[i - 1][j - 1] ^ dp[i][j - 1] ^ dp[i - 1][j] ^ matrix[i][j];根据状态转移方程可以很容易的求得二维dp数组。由于题目是让求第K大的异或值,只需对所有的异或值进行排序,然后返回第K大的异或值即可。代码实现:class Solut

2021-05-19 13:58:09 69

原创 leetCode每日一题-2021/05/18-形成两个异或相等数组的三元组数目

形成两个异或相等数组的三元组数目我是垃圾,第一时间连前缀和都没想到~~~。说说这道题吧,首先想到的思路是三次循环,然后在第三重循环中再套一重循环求a和b的值,判断是ab否相等。时间复杂度为n^4,结果没有任何悬念的超时了。附上代码:class Solution {// 暴力解法public int countTriplets(int[] arr) {int cnt = 0;for( int i = 0; i < arr.length; ++i ){for( int j = i +

2021-05-18 17:30:00 61

原创 LeetCode每日一题-2021/05/17-二叉树的堂兄弟节点

二叉树的堂兄弟节点-java(DFS)题目如下:求两个节点是否为堂兄弟节点,只需要两个节点的深度(即depth)相等并且父节点不是同一个即可(为了方便,只需要父节点的值不相等)也就是说满足堂兄弟节点的条件就是:两个节点的深度相等父节点的值不相等主要思路:前序遍历整棵树,维护每个节点的深度和父节点,将x、y的深度和父节点的值保存起来。树的遍历完成后,判断值为x、y的节点是否为堂兄弟节点即可。代码如下:/** * Definition for a binary tree node. *

2021-05-17 22:57:42 70

原创 leetcode之奇妙的异或运算

leetcode之奇妙的异或运算开始之前,我们先了解一下异或的概念:这是百度百科上异或的解释,这里精简一下:两数异或,相同为0,不同为1.另外,异或有两个重要的性质:满足交换律一个数异或0还是它本身(在后面会用到这两个性质)leetcode 136这个题较简单,但如果用异或操作,可以不使用额外空间来实现。原理就是:先对数组中所有元素进行异或运算。nums[0] ^ nums[1] ^ … ^ nums[nums.length() - 1]利用上面提到的两个性质:利用交换律

2020-12-18 20:19:28 434

原创 JAVA学习笔记:用IO流查看自己写了多少行程序

JAVA用IO流查看自己写了多少行程序作为一个入坑JAVA有一段时间的小白,相信很多同学都有查看***自己到底写了多少行代码***的想法。本文利用简单的IO流可以实现这一功能:主要原理:利用缓冲流BufferedReader的**readLine()**方法,可以一行一行的读取(但该方法不识别换行符,所以输出的总行数不包括空行)。代码如下:import org.junit.Test;import java.io.*;public class Test {int count;

2020-09-20 22:10:47 284

空空如也

空空如也

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

TA关注的人

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