自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 每日算法-N 叉树的后序遍历

题目给定一个 N 叉树,返回其节点值的 后序遍历 。N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。进阶:递归法很简单,你可以使用迭代法完成此题吗?示例 1:输入:root = [1,null,3,2,4,null,5,6]输出:[5,6,3,2,4,1]示例 2:输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,nul

2021-04-12 20:26:42 303

原创 每日算法-N 叉树的前序遍历

题目给定一个 N 叉树,返回其节点值的 前序遍历 。N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。进阶:递归法很简单,你可以使用迭代法完成此题吗?示例 1:输入:root = [1,null,3,2,4,null,5,6]输出:[1,3,5,6,2,4]示例 2:输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,nul

2021-04-12 20:25:36 257

原创 排序

1, 冒泡排序冒泡排序算法的运作如下:比较两个相邻的数,如果前面的数大于后面的数,则将这两个数交换位置。第一次遍历后,最大的数会被放到数组的最后位置,即array[length - 1]。第二次遍历时跳过最后一个元素,因为该元素通过第一次遍历已经确定是最大值。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。代码:public static void bubbleSort(int[] array) { if (array == null || array.len

2021-04-03 10:33:35 250

原创 Java中类加载器

前言类加载过程:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。数组类型不通过类加载器创建,它由 Java 虚拟机直接创建。所有的类都由类加载器加载,加载的作用就是将 .class文件加载到内存。类加载过程我们不在这里详细说了,有需要的小伙伴可以去看下这篇文章哦:《Java中类的一生是如何度过的?》 1. 常用的类加载器JVM 中内置了三个重要的类加载器(ClassLoader),除了 BootStrapClassLoader 其他类加载器均由 Ja

2021-03-29 21:37:13 572

原创 Idea中刷新Git分支列表

Idea中使用Git查看分支列表的时候,总是不出现新的分支或者远程已经没有的分支在本地还有,这时就需要更新下本地的git分支保持和远程分支一致,使用下面几个方法都可以。方法一,Update Project点击项目的根目录 ,然后点击 VCS —> Update Project.. 即可更新Git服务的最新所有分支了。方法二,Fetch点击项目的根目录,然后点击 VCS —> Git —> Fetch ,即可刷新本地分支列表了。方法三,使用命令// 从远程更新git remo

2021-03-29 13:47:13 25317

原创 Java中类的一生是如何度过的?

1. 类的生命周期一个类的完整生命周期如下:2. 类加载过程Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢?系统加载 Class 类型的文件主要三步: 加载 --> 连接 --> 初始化 。连接过程又分为三步:验证 --> 准备 --> 解析 。2.1. 加载类加载过程的第一步,主要完成下面3件事情:通过全类名获取定义此类的二进制字节流。将字节流所代表的静态存储结构转换方法为方法区的运行时数据结构。在内存

2021-03-28 20:50:31 423 5

原创 爆肝整理-JVM垃圾回收

文章目录前言1. JVM 内存分配与回收的神秘面纱1.1. 对象优先在 eden 区分派1.2. 大对象直接进入老年代1.3. 长期存活的对象将进入老年代1.4. 主要进行 GC 的区域2. 如何判断对象已经死亡?2.1. 引用计数法2.2. 可达性分析算法2.3. 再谈引用2.4. 不可达的对象并非 “非死不可”2.5. 如何判断一个常量是废弃常量?2.6. 如何判断一个类是无用的类3. 垃圾收集算法3.1. 标记-清除算法3.2. 标记-复制算法3.3. 标记-整理算法3.4. 分代收集算法4. 垃圾收

2021-03-28 16:59:57 185

原创 爆肝整理-Java内存区域

文章目录1. 概述2. 运行时数据区域2.1. 程序计数器2.2. Java 虚拟机栈2.3. 本地方法栈2.4. 堆2.5. 方法区2.5.1. 方法区和永久代的关系2.5.2. 常用参数2.5.3. 为什么要将永久代(PermGen)替换为元空间(Metaspace)呢?2.6. 运行时常量池2.7. 直接内存3. HotSpot 虚拟机对象探秘3.1.对象的创建3.2. 对象的内存布局3.3. 对象的访问定位4. 重点补充内容4.1. String 类和常量池4.2 String s1 = new S

2021-03-25 21:44:07 239

原创 Java多线程进阶面试-Atomic 原子类

1.介绍一下 Atomic 原子类Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子 / 原子操作特征的类。并发包 java.util.concurrent 的原子类都存放在 java.util.concurrent.atomic 下,如下图所示:2. JUC 包中的原子类是哪4

2021-03-25 10:40:10 792 1

原创 Java多线程进阶面试-ThreadLocal

1. ThreadLocal 简介通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想要实现每一个线程都有自己的专属本地变量该如何解决呢? JDK 中提供的 ThreadLocal 类正是为了解决这样的问题。 ThreadLocal 类主要解决的是让每个线程绑定自己的值,可以将 ThreadLocal 类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个 ThreadLocal 变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是 ThreadLoc

2021-03-24 22:00:42 256

原创 Java多线程进阶面试-volatile 关键字

我们要先从 CPU缓存模型 说起。1. CPU缓存模型为什么要弄一个CPU 高速缓存呢?类似我们开发网站后台系统使用的缓存(比如redis)是为了解决程序处理速度和访问常规关系数据库速度不对等的问题。CPU缓存 则是为了解决CPU 处理速度和内存处理速度不对等问题。我们甚至可以把 内存看作外存的高速缓存 ,程序运行的时候,我们把外存的数据复制到内存,由于内存的处理速度远远高于外存,这样提高了处理速度。总结: CPU Cache 缓存的是内存数据用于解决CPU处理速度和内存不匹配的问题,内存缓存的

2021-03-24 21:13:26 174

原创 Java多线程进阶面试-synchronized关键字

文章目录1. 说一说对synchronized的了解2. 说一下如何使用synchronized 关键字的3. 代码讲解,双重校验锁实现对象实例(保证线程安全)4. 构造方法可以使用synchronized关键字修饰吗?5. 讲一下synchronized 关键字的底层原理5.1. synchronized 同步代码块的情况5.2. synchronized 修饰方法的情况5.3. 总结6. 谈谈 synchronized 和 ReentrantLock 的区别6.1. 两者都是可重入锁6.2.synchr

2021-03-24 19:28:25 530 4

原创 Java 1.6 到底对synchronized做了什么?

文章目录1. 概述2. 实现同步的基础3. 实现方式4. 对象头4.1. MarkWord4.2. 类型指针4.3. 对象头的长度5.优化后synchronized锁的分类6. 锁的升级6.1. 偏向锁6.2. 轻量级锁6.3. 锁的比较7. 总结1. 概述在多线程并发编程中 synchronized 一直是元老级角色,很多人都会称呼它为 重量级锁 ,但是,随着 Java SE 1.6 版本对 synchronzied 进行了各种优化之后,有些情况它并不那么重了。本文将详细介绍 Java SE 1.6

2021-03-24 19:21:27 374

原创 每日算法-最长回文串

题目给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。注意:假设字符串的长度不会超过 1010。示例 1:输入:"abccccdd"输出:7解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。解法class Solution { public int longestPalindrome(String s) { int result =

2021-03-23 18:14:29 112

原创 每日算法-数字转换为十六进制

题目给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。注意:十六进制中所有字母(a-f)都必须是小写。十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。给定的数确保在32位有符号整数范围内。不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。示例 1:输入:26输出:"1a"示例 2:输入:-1输出:"ffffffff"

2021-03-23 18:13:27 2377

原创 设计模式之代理模式-简单、清晰、易懂

文章目录1. 代理模式理解2. 静态代理3. 动态代理3.1. JDK动态代理3.1.1. 介绍3.1.2. JDK动态代理类实现3.1.3. 示例代码3.2. CGLIB 动态代理3.2.1. 介绍3.2.2. CGLIB动态代理类实现3.2.3.示例代码3.3. JDK动态代理 和 CGLIB动态代理对比4. 静态代理和动态代理的对比5. 总结1. 代理模式理解简单来说,代理模式就是 我们使用代理对象来代替访问真实对象的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的额

2021-03-20 16:12:20 248 3

原创 每日算法-找不同

题目给定两个字符串 s 和 t,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。示例 1:输入:s = "abcd", t = "abcde"输出:"e"解释:'e' 是那个被添加的字母。示例 2:输入:s = "", t = "y"输出:"y"示例 3:输入:s = "a", t = "aa"输出:"a"示例 4:输入:s = "ae", t = "aea"输出:"a"提示:0 <= s.

2021-03-19 10:39:38 192

原创 每日算法-字符串的第一个唯一字符

题目给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。示例:s = "leetcode"返回 0s = "loveleetcode"返回 2提示: 你可以假定该字符串只包含小写字母。解法思路一: 判断前后子串是否有当前字符,不再赘述。class Solution { // 判断前后子串是否有当前字符 public int firstUniqChar(String s) { if(s == null || s ==

2021-03-19 10:21:05 132

原创 每日算法-有效的完全平方数

题目给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。进阶:不要 使用任何内置的库函数,如 sqrt 。示例 1:输入:num = 16输出:true示例 2:输入:num = 14输出:false提示:1 <= num <= 2^31 - 1解法思路: 二分查找,具体细节看代码注释。class Solution { // 二分查找 public boolean isPerfe

2021-03-19 10:16:26 173

原创 每日算法-两个数组的交集 II

题目给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果的顺序。进阶:如果给定的数组已经排好序呢?你将如何优化你的算法?如果 nums1 的大小比 nums2 小很多,哪种方法更优?

2021-03-15 19:43:20 153

原创 每日算法-两个数组的交集

题目给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。解法解法一: 遍历数组,把目标数组放进Set中,再做判断。class Solution { /** 方法一:遍历数组,把目标数组放进Set

2021-03-15 19:42:15 132

原创 每日算法-4的幂

题目给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x示例 1:输入:n = 16输出:true示例 2:输入:n = 5输出:false示例 3:输入:n = 1输出:true提示:-231 <= n <= 231 - 1解法方法一: 循环。class Solution { // 循环 public boolean

2021-03-12 17:17:33 350

原创 每日算法-单词规律

题目给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律。这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应规律。示例1:输入: pattern = "abba", str = "dog cat cat dog"输出: true示例 2:输入:pattern = "abba", str = "dog cat cat fish"输出: false示例 3:输入: pattern =

2021-03-12 14:17:15 232

原创 每日算法-丢失的数字

题目给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?示例 1:输入:nums = [3,0,1]输出:2解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。示例 2:输入:nums = [0,1]输出:2解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,

2021-03-11 19:48:41 208

原创 每日算法-二叉树的所有路径

题目给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3解法思路: 递归,具体细节看代码中注释。/** * Definition for a binary tree node. * public class TreeNode {

2021-03-11 13:22:03 134

原创 每日算法-有效的字母异位词

题目给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false说明:你可以假设字符串只包含小写字母。进阶:如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?解法思路: 先对两个字符串进行排序,然后再逐一比较。class Solution { publi

2021-03-11 11:38:04 98

原创 每日算法-回文链表

题目请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?解法思路一: 先把链表的值都存进list中,然后再判断list是否存在回文性质。/** * Definition for singly-linked list. * public class ListNode { * int val; *

2021-03-10 16:57:39 107 2

原创 每日算法-用栈实现队列

题目请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x)将元素 x 推到队列的末尾int pop()从队列的开头移除并返回元素int peek()返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回false说明:你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size,

2021-03-10 14:22:46 103

原创 每日算法-2的幂

题目给定一个整数,编写一个函数来判断它是否是 2 的幂次方。示例 1:输入: 1输出: true解释: 20 = 1示例 2:输入: 16输出: true解释: 24 = 16示例 3:输入: 218输出: false解法思路一: 二分查找法class Solution { /** 二分查找法 */ public boolean isPowerOfTwo(int n) { if(n <= 0){

2021-03-10 11:31:39 168

原创 每日算法-汇总区间

题目给定一个无重复元素的有序整数数组 nums 。返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。列表中的每个区间范围 [a,b] 应该按如下格式输出:"a->b" ,如果 a != b"a" ,如果 a == b示例 1:输入:nums = [0,1,2,4,5,7]输出:["0->2","4->5","7"]解释:区间范围是:[0,2] -

2021-03-10 10:41:45 86

原创 每日算法-四数之和

题目给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意: 答案中不可以包含重复的四元组。示例 1:输入:nums = [1,0,-1,0,-2,2], target = 0输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]示例 2:输入:nums = [], target = 0输出:[]

2021-03-09 20:35:42 163 2

原创 每日算法-最接近的三数之和

题目给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例:输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。提示:3 <= nums.length <= 10^3-10^3 <= nums[i] <= 10^3-10^4 &l

2021-03-09 14:11:57 177

原创 每日算法-三数之和

题目给你一个包含n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意: 答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]提示:0 <= nums.length <= 3000-1

2021-03-08 17:27:53 125 1

原创 每日算法-用队列实现栈

题目请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。注意:你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front

2021-03-08 16:39:43 133

原创 每日算法-存在重复元素 II

题目给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引i 和 j,使得nums [i] = nums [j],并且 i 和j的差的 绝对值 至多为 k。示例 1:输入: nums = [1,2,3,1], k = 3输出: true示例 2:输入: nums = [1,0,1,1], k = 1输出: true示例 3:输入: nums = [1,2,3,1,2,3], k = 2输出: false解法思路: 哈希表。class Solution { p

2021-03-08 15:47:57 98

原创 每日算法-存在重复元素

题目给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true解法思路: 哈希表。class Solution { public boolean containsDuplicate(int[] num

2021-03-08 15:42:15 76

原创 每日算法-移除链表元素

题目给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[]示例 3:输入:head = [7,7,7,7], val = 7输出:[]提示:列表中的节点在范围 [0, 104] 内1 <= Node.val <

2021-03-08 15:37:36 123 1

原创 每日算法-位1的个数

题目编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。进阶:如果多次调用这个函数,你将如何优化你

2021-03-07 19:28:00 80

原创 每日算法-Excel表列序号

题目给定一个Excel表格中的列名称,返回其相应的列序号。例如,A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ...示例 1:输入: "A"输出: 1示例 2:输入: "AB"输出: 28示例 3:输入: "ZY"输出: 701解法思路: 字符串遍历,进制转换。class Solution { public int titleToNumber(String s) {

2021-03-07 19:27:02 198

原创 每日算法-整数转罗马数字

题目罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

2021-03-07 19:25:35 57

空空如也

空空如也

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

TA关注的人

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