自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 8种数据结构

目录数组(Array)链表(Linked List)散列表(Hash)栈(Stock)队列(Queue)树(Tree)堆(Heap)图(Map)数组(Array)数组是指有有序的元素序列。最常用到的数据结构。优点:1、按照索引查询元素速度快2、按照索引遍历数组方便缺点:1、数组的大小固定后就无法扩容了2、数组只能存储一种类型的数据3、添加,删除的操作慢,因为要移动其他的元素。链表(Linked List)链表是一种物理存储单元上非连续、非

2021-08-24 16:50:05 139

原创 并发专题学习总结回顾

1丶JMM模型2丶Volatile3丶Synchronized4丶Lock5丶Reentrantlock6丶AQS7丶CAS8丶并发编程之Tools&CountDownLatch&Semaphore原理与应用9丶并发编程之Atomic&Unsafe魔法类详解10丶并发编程之Collections&Queue体系分析11丶HashMap12丶CurrentHashMap13丶ThreadLocal14丶copyOnWriteArrayList15丶E

2021-08-23 18:28:15 108

转载 synchronized

加锁方式①.同步实例方法,锁是当前实例对象②.同步类方法,锁是当前类对象③.同步代码块,锁是括号里面的对象底层原理JVM内置锁通过synchronized使用,通过内部对象Monitor(监视器锁)实现,基于进入与退出Monitor对象实现方法与 代码块同步,监视器锁的实现依赖底层操作系统的Mutex lock(互斥锁)实现,它是一个重量级锁性能较低每个对象都要有自己的一个Monitor(监视器锁)。JVM加锁过程:对象的内存结构对象头:比如 hash码,对象所属

2021-08-23 17:40:07 95

转载 java各种锁

一张图读懂非公平锁与公平锁本文仅限个人学习交流,支持原创,侵权必删。参考链接:https://www.jianshu.com/p/f584799f1c77

2021-08-23 17:01:08 64

转载 并发编程之单例模式

目录8种方法创建单例模式优缺点讨论双重检查及volatile作用单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。单例模式有 3 个特点:单例类只有一个实例对象; 该单例对象必须由单例类自行创建; 单例类对外提供一个访问该单例的全局访问点。创建单例模式方式/** * 饿汉式 * .

2021-08-23 16:38:50 314

转载 volatile关键字

volatile 能保证可见性丶有序性。但是不能保证原子性。volatile是Java虚拟机提供的轻量级的同步机制volatile语义有如下两个作用可见性:保证被volatile修饰的共享变量对所有线程总数可见的,也就是当一个线程修改了一个被volatile修饰共享变量的值,新值总是可以被其他线程立即得知。有序性:禁止指令重排序优化。volatile缓存可见性实现原理JMM内存交互层面:volatile修饰的变量的read、load、use操作和assign、store、write必须是连续的

2021-08-17 22:58:25 112

转载 JMM模型

个人理解:JMM(Java Memory Model简称JMM) 描述的是一组规则或者规范,大致讲的是线程与内存工作的交互关系。它是围绕着原子性丶可见性丶有序性来展开的。官方解释:Java内存模型(Java Memory Model简称JMM)是一种抽象的概念,并不真实存在,它描 述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构 成数组对象的元素)的访问方式。JVM运行程序的实体是线程,而每个线程创建时JVM都会为 其创建一个工作内存(有些地方称为栈

2021-08-17 22:16:17 87

原创 LeetCode面试10.01 合并排序数组

给定两个排序后的数组 A 和 B,其中 A 的末端有足够的缓冲空间容纳 B。 编写一个方法,将 B 合并入 A 并排序。初始化A 和 B 的元素数量分别为m 和 n。示例输入:A = [1,2,3,0,0,0], m = 3B = [2,5,6], n = 3输出:[1,2,2,3,5,6]说明 A.length == n+m链接:https://leetcode-cn.com/problems/sorted-merge-lcci/解题思路暴力算法...

2021-08-11 10:28:56 171

原创 LeetCode1290 二进制链表转整数

给你一个单链表的引用结点head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。链接:https://leetcode-cn.com/problems/convert-binary-number-in-a-linked-list-to-integer/解题思路直接遍历即可,左移相当于将原来的数乘以2。代码class Solution { public int getDecimalValue(ListN.

2021-08-09 18:30:44 53

原创 LeetCode203 移除链表元素

给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val == val的节点,并返回新的头节点。链接:https://leetcode-cn.com/problems/remove-linked-list-elements/解题思路:这个题目感觉是考对链表的基本操作,没有什么思路。如果该节点的下一个指针等于val,那就将这个指针指向下下个指针(curr.next = curr.next.next)。 public static ListNode ...

2021-08-09 15:39:57 61

原创 LeetCode876 链表的中间结点

给定一个头结点为head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/解题思路普通解法:循环链表 统计出链表的长度sum。然后除2,然后再遍历一次找到链表对应节点返回就可以了。代码public static ListNode middleNode(ListNode head) { ListNode temp...

2021-08-09 15:28:24 66

转载 用户线程丶内核线程概念解释

内核&操作系统介绍和对比1 内核,是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。用户态&内核态,用户线程&内核线程概念解释 什么是系统调用用户态和内核态,也称为用户模式和内核模式。处于内核态的操作系统内核对于硬件有不受限制的使用权限,并且可以执行任何 CPU 指令以及访问任意的内存地址。而用户态进程没有能力直接操作硬件,也没有能力访问任意的

2021-08-09 10:55:25 473

转载 LeetCode83 删除排序链表中的重复元素

存在一个按升序排列的链表,给你这个链表的头节点head,请你删除所有重复的元素,使每个元素只出现一次。链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/解题思路由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。具体地,我们从指针cur 指向链表的头节点,随后开始对链表进行遍历。如果当前 cur 与 \cur.next 对...

2021-08-05 11:46:44 54

转载 动态规划套路详解

一、斐波那契数列请读者不要嫌弃这个例子简单,只有简单的例子才能让你把精力充分集中在算法背后的通用思想和技巧上,而不会被那些隐晦的细节问题搞的莫名其妙。想要困难的例子,历史文章里有的是。1、暴力递归斐波那契数列的数学形式就是递归的,写成代码就是这样:int fib(int N) { if (N == 1 || N == 2) return 1; return fib(N - 1) + fib(N - 2);}这个不用多说了,学校老师讲递归的时候似乎都是拿这个举例。我们也知道这...

2021-08-04 23:26:22 276

转载 java 多线程基础

目录创建线程的四种方式线程的生命周期synchronizedLock多线程卖票问题生产者消费者模型创建线程的四种方式① 继承Tread类,重写run方法。② 实现runnable接口,重写run方法。③ 使用FutureTask,重写callable方法,该方法是有返回值的。④ 使用线程池。(本文章不做演示)代码package com.test;import java.util.concurrent.Callable;import java.uti

2021-08-04 10:50:09 80

转载 java IO流

字节流字符流字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:①读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。②处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。③字节流:一次读入或读出是8位二进制。 字符流:一次读入或读出是16位二进制。设备上的数据无论是图片或者...

2021-08-03 14:53:44 68

原创 LeetCode509 斐波那契数

斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1)= 1F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你 n ,请计算 F(n) 。链接: 解题思路:递归算法:这里暴力递归就可以了。这回终于不用打TODO标签了,通俗的说递归算法就是在自己写的方法中调用自己本身,自己调自己;递归算法的解题思路是将一个问题转化成一个 与原问题相似 但.

2021-07-31 22:12:18 73

原创 LeetCode53 最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1] 的和最大,为 6 。链接:解题思路: 暴力算法 双重for循环 把所有连续子数组的和求出来进行比较,记录最大值maxSum。代码 public static int maxSubArray(int[] nums) { if (num.

2021-07-30 10:56:26 54

转载 LeetCode21 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]遍历:考虑四种情况l2 比l1 长 l1比l2长l1的值比l2的值大 的情况l2的值比l1大的情况定义一个resultNode返回链表。还需要定义一个temp链表 指向头结点的尾部 进行尾插法代码 public static ListNode mergeTwoLists(L

2021-07-29 18:53:14 53

原创 LeetCode面试金典0106 字符串压缩

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。链接: 解题思路双指针算法定义两个指针 left right。如果right 指针处的字符等于 left指针 处的字符 cont++。相当于我(right)和你(left)一起跳格子。 我先走 我每次走一个就回头和你比较一下,如果我格子里面的字母和你一.

2021-07-28 22:33:29 100

原创 LeetCode160 相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。链接: https://leetcode-cn.com/problems/intersection-of-two-linked-lists/https://leetcode-cn.com/problems/intersection-of-two-linked-lists/.

2021-07-27 14:42:33 39

原创 LeetCode643 子数组最大平均数 I

给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。示例:输入:[1,12,-5,-6,50,3], k = 4输出:12.75解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75链接: https://leetcode-cn.com/problems/maximum-average-subarray-i/解题思路双指针算法 left 和 right 同时向右移动 , maxSum用来存储 left 和right 之间的最大值。.

2021-07-27 11:52:26 52

原创 LeetCode面试金典0102 判定是否互为字符重排

给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。示例 1:输入: s1 = "abc", s2 = "bca"输出: true 链接: 解题思路第一种利用Map统计,直接new两个HashMap key为出现的字符,value为出现的次数。如果s1Map.size() != s2Map.size(),那么就不是字符重排,然后循环s1Map 根据s1的key去获取s2Map对应key值的value。如果s1Value !=.

2021-07-26 18:32:36 94

原创 LeetCode面试金典0101 判定字符是否唯一

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。示例 1:输入: s = "leetcode"输出: false示例 2: 输入: s = "abc"输出: true链接: 解题思路第一种暴力算法 双重for循环,挨个比较。第二种使用hashMap(key为字符串中的字符,value为出现的次数) 如果有一个key 的value的值 >1 那么就是重复了。第三种直接利用HashSet的特性。第四种位运算,这个的话题目好像也没说字符一定时26个英文字母。就暂.

2021-07-26 18:20:33 52

转载 LeetCode69 x的平方根

实现int sqrt(int x)函数。计算并返回x的平方根,其中x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。题目链接:https://leetcode-cn.com/problems/sqrtx/解题思路暴力算法: 直接循环0 ~ x, 使得 i* i <= x (i+1)*(i+1)> x就可以了。二分查找法: 比暴力算法优化那么一丢丢,因为0~x是顺序递增,就可以少计算那么几次。牛顿迭代:先打个TODO标识吧,看了也不是很懂。...

2021-07-25 15:52:48 64

原创 LeetCode141 环形链表

给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。链接:https://leetcode-cn.com/problems/linked-list-cycle/解题

2021-07-24 10:41:05 63

原创 LeetCode167 两数之和II - 输入有序数组

给定一个已按照 升序排列的整数数组numbers ,请你从数组中找出两个数满足相加之和等于目标数target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。链接:https://leetcode-cn.com/problems/two...

2021-07-24 10:26:51 60

原创 LeetCode1 两数之和

给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。题目链接:https://leetcode-cn.com/problems/two-sum.

2021-07-23 14:56:40 32

原创 LeetCode628 三个数的最大乘积

给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。题目链接:https://leetcode-cn.com/problems/maximum-product-of-three-numbers/解题思路分情况来讨论:1 如果全是正数 : 那么就是三个最大的数相乘2 如果全是负数 : 也是三个最大的数相乘3 如果有正有负的情况: 两个负数: 就是负负得正,那么需要比较 两个负数相乘再乘以最大的数 和 三个最大的正数相乘 比较大小。 一个负数:

2021-07-23 12:10:11 78

原创 LeetCode724 寻找数组的中心下标

给你一个整数数组 nums ,请计算数组的 中心下标 。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。题目链接:https://leetcode-cn.com/problems/find-pivot-index/解题思路首先求出这个数.

2021-07-23 10:02:38 205

原创 LeetCode26 删除有序数组中的重复项

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 题目链接https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/解题思路:暴力算法: 通过hashSet的特性来进行数组去重 然后返回hashSet的size(毕竟生活中不会限制你的实现方式,这里就..

2021-07-22 20:28:00 93

原创 LeetCode204 计数质数

统计所有小于非负整数 n 的质数的数量。 输入:n = 10输出:4解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。题目链接:https://leetcode-cn.com/problems/count-primes/

2021-07-21 10:22:33 63

原创 LeetCode206 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?题目链接: https://leetcode-cn.com/problems/reverse-linked-list/#解题思路##迭代算法##递归算法#...

2021-07-20 23:41:44 101 1

空空如也

空空如也

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

TA关注的人

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