自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java中==操作符和equals()方法的区别?hashCode()方法又是什么?

方法用来获取对象的哈希码(int整数),哈希码是由对象的内存地址或者对象的属性计算出来的。哈希码用于散列存储结构,比如HashMap,HashSet,中确定对象的存储位置。可用于快速比较两个对象是否不同,因为如果它们的哈希码不同,那么它们肯定不相等。==,equals(),hashCode()都是Java中比较对象的方式。不能用于基本数据类型的判断,只能判断两个对象是否相等。

2025-06-09 23:54:10 733

原创 为什么重写equals()方法时必须重写hashCode()方法?

具体地说,HashMap通过对象的哈希码将其存储在不同的“桶”中,当查找对象时,需要使用key的哈希码来确定对象在哪个桶中,然后再通过equals()方法找到相应的对象。因为基于哈希的集合类(如HashMap)需要基于这一点来正确存储和查找对象。解决方案:同时重写 equals() 和 hashCode()问题 2:HashMap 无法正确查找数据​。场景:自定义类作为 HashMap 的键​。问题 1:HashMap 存储重复键​。

2025-06-09 23:52:17 185

原创 剑指offer JZ23 链表中环的入口结点

快慢指针,fast指针走两步,slow指针走一步,如果fast指针走到尾部了,说明链表中没有环,返回null,否则fast指针与slow指针相遇,存在环,退出循环。由于相遇节点到入口节点的距离与头结点到入口节点的距离相同,我们将fast指针置为head,每次循环fast和slow各走一步,当fast==slow时,则找到入口节点,返回fast。环的部分只有一个结点,所以返回该环形链表入口结点,后台程序打印该结点对应的结点值,即2。可以看到环的入口结点的结点值为3,所以返回结点值为3的结点。

2025-06-08 23:57:49 308

原创 Java中的深拷贝与浅拷贝有什么区别?

在Java中,深拷贝(Deep Copy)​与浅拷贝(Shallow Copy)是两种拷贝对象的方式,它们在拷贝对象的方式上有很大不同。

2025-06-08 23:42:39 551

原创 剑指offer JZ3 数组中重复的数字

在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1。利用集合,遍历的同时加入元素,每次判断集合中是否存在当前元素,存在说明该元素重复,返回该元素。无重复元素返回-1。进阶:时间复杂度O(n) ,空间复杂度O(n)输入:[2,3,1,0,2,5,3]数据范围:0≤n≤10000。

2025-06-07 23:47:06 105

原创 剑指offer JZ5 替换空格

例如,当字符串为“We Are Happy“.则经过替换之后的字符串为“We%20Are%20Happy“。数据范围:0≤len(s)≤1000。保证字符串中的字符为大写英文字母、小写英文字母和空格中的一种。请实现一个函数,将一个字符串s中的每个空格替换成“%20“。遍历字符串进行替换,for-each是顺序遍历的。

2025-06-07 23:41:43 168

原创 剑指offer JZ6 从尾到头打印链表

后进先出可以用栈来实现,用栈自然想到可以用递归来实现,递归实现比较简洁一点。输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。0 <= 链表长度 <= 10000。输入:{67,0,24,58}返回一个数组为[3,2,1]返回值:[3,2,1]输入:{1,2,3}

2025-06-07 23:35:48 143

原创 剑指offer JZ9 用两个栈实现队列

当调用pop()时,如果此时栈stk2为空时,将栈stk1的元素逐个弹出并压入栈stk2中,然后弹出栈stk2的栈顶元素即可。用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。两个栈实现队列,其中一个栈stk1用来输入元素,另一个栈stk2用来输出元素。输入:[“PSH1”,“PSH2”,“POP”,“POP”]输入:[“PSH2”,“POP”,“PSH1”,“POP”]"POP“:代表删除一个元素,先进先出=>返回1。

2025-06-07 23:27:35 162

原创 剑指offer JZ10 斐波那契数列

根据斐波那契数列的定义可知,fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(4-1)+fib(4-2)=3,所以答案为3。要求:空间复杂度 O(1),时间复杂度 O(n) ,本题也有时间复杂度 O(logn) 的解法。大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。斐波那契数列是一个满足。数据范围:1≤n≤40。

2025-06-07 23:11:47 206

原创 剑指offer JZ12 矩阵中的路径

我们可以设计一个函数,dfs(x, y, k)表示,从(x, y)开始,且当前将要匹配的字符为word[k],是否能找到字符串为word的路径,不能返回false,否则返回true。矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。输入:[[a,b,c,e],[s,f,c,s],[a,d,e,e]],“abcb”数据范围:0≤n,m≤20 ,1≤len≤25。

2025-06-06 22:21:59 448

原创 剑指offer JZ13 机器人的运动范围

0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[0,10],[0,11],[0,12],[0,13],[0,14],[0,15],[0,16],[0,17],[0,18],[0,19],[0,20],[0,21],[0,22],[0,23],[0,24],[0,25],[0,26],[0,27],[0,28] 这29种,后面的[0,29],[0,30]以及[0,31]等等是无法到达的。输入:5,10,10。

2025-06-06 21:51:23 352

原创 一文搞懂String,StringBuilder,StringBuffer的区别

它们都是Java中处理字符串的类,区别主要体现在可变性,线程安全,性能上。

2025-06-05 20:57:54 444

原创 剑指offer JZ15 二进制中1的个数

负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1。十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。输入一个整数 n ,输出该数32位二进制表示中1的个数。数据范围:−2147483648<=n<=2147483647。可以看出每次n&(n - 1)都可以消除掉最右边的1。我们只需要同时维护count即可,最后返回count。

2025-06-05 10:16:16 199

原创 剑指offer JZ22 链表中倒数最后k个结点

快慢指针,初始化fast和slow为head,模拟一下,可以发现,让fast先走k-1步,slow不动,接着让fast和slow一起向后走,当fast走到尾节点的时候,slow这时候指向的就是目标节点了,最后返回slow即可。另外需要注意代码的鲁棒性,考虑到特殊输入。其中蓝色部分为该链表的最后2个结点,所以返回倒数第2个结点(也即结点值为4的结点)即可,系统会打印后面所有的节点来比较。输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。输入:{1,2,3,4,5},2。

2025-06-04 23:29:56 164

原创 剑指offer JZ16 数值的整数次方

13 转换为二进制后为1101,我们只需要将二进制为1的位累乘进结果就好了,当位数为1时,累乘进结果,维护一个base,始终累乘自身,接着将二进制幂右移一位。实现函数 double Power(double base, int exponent),求base的exponent次方。∣base∣≤100 , ∣exponent∣≤100 ,保证最终结果一定满足 ∣val∣≤10 4。二进制取幂的想法时,我们将取幂的任务按照指数的二进制表示来分割成更小的任务.需要将base为分数,幂转换为正数。

2025-06-04 22:41:40 308

原创 剑指offer JZ17 打印从1到最大的n位数

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。n 为正整数,0 < n <= 5。用返回一个整数列表来代替打印。

2025-06-04 22:02:23 161

原创 剑指offer JZ14 剪绳子

给你一根长度为 n 的绳子,请把绳子剪成整数长的 m 段( m 、 n 都是整数, n > 1 并且 m > 1 , m <= n ),每段绳子的长度记为 k[1],…例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18。我们将f[i]定义为正整数i可以拆分的最大乘积,定义f[1] = 1,最后答案为f[n].考虑i最后拆分出的数字j,其中j的范围为[1, i)。进阶:空间复杂度 O(1) ,时间复杂度 O(n)m>1,所以切成两段长度是1的绳子。

2025-06-04 21:42:26 373

原创 剑指offer JZ18 删除链表的节点

遍历链表,当cur.next.val==val时,说明找到了要删除的节点,然后cur.next=cur.next.next删除该节点,接着跳出循环。给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9。给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 2 -> 5 -> 9。给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。0<=链表节点值<=10000。0<=链表长度<=10000。

2025-06-04 21:16:00 123

原创 剑指offer JZ20 表示数值的字符串

2.str 仅含英文字母(大写和小写),数字(0-9),加号 ‘+’ ,减号 ‘-’ ,空格 ’ ’ 或者点 ‘.’。例如,字符串[“+100”,“5e2”,“-123”,“3.1416”,“-1E-16”]都表示数值。首先去除首尾空格,此时i, j,分别指向str中的第一个非空格字符和最后一个非空格字符。3.2 至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字。3.(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个整数(可正可负)空格,数字,小数点,e,E,+,-

2025-06-04 20:56:31 432

原创 剑指offer JZ21 调整数组顺序使奇数位于偶数前面(一)

输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。第一反应双指针,写了一下有一半数据没通过,模拟了一下数据,又看了下题目,发现题目要求说要保证相对顺序,那就开一个辅助数组来做,保证相对顺序。进阶:时间复杂度 O(n 2 ),空间复杂度 O(1)要求:时间复杂度 O(n),空间复杂度 O(n)0≤n≤5000,数组中每个数的值。

2025-06-04 20:15:44 272

原创 剑指offer JZ7 重建二叉树

接着就可以递归构建二叉树的左子树和右子树了,通过dfs函数递归构建,dfs(i, j, n) 表示以从前序遍历第i个节点开始的n个节点以及对应的中序遍历中第j个节点开始的n个节点,构建出的包含n个节点的二叉树,递归构建左子树dfs(i + 1, j, k - j),递归构建右子树dfs(i + k - j + 1, k + 1, n - (k - j) - 1)。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。

2025-05-20 23:55:52 221

原创 剑指offer JZ8 二叉树的下一个结点

接下来讨论没有右子树的情况,如果当前节点是父节点的左子节点那么返回当前节点的父节点,比如说d节点的下一个节点是b节点,如果当前节点是父节点的右子节点,那么就继续向上,回溯寻找下一个节点,直到找到当前节点是父节点的左子节点或父节点为空,返回当前节点的父节点,比如说i节点的下一个节点是a节点。需要注意的是需要考虑边界条件是否合法,树中只有一个节点的情况,当前节点是中序遍历的最后一个节点,是否能正确处理,并返回正确结果。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示。

2025-05-20 22:05:19 759

原创 剑指offer JZ11 旋转数组的最小数字

可以发现答案被跳过了,所以要对代码进行一些修改,以便能够应对有重复元素的情况,当nums[mid] == nums[r],我们可以进行简单地缩小范围,-- r 即可,排除当前元素,即便当前元素是最小元素,被排查掉了,那么还有nums[mid]还可以用,还有可能是最小元素,作为答案返回。有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。

2025-05-20 16:31:45 390

空空如也

空空如也

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

TA关注的人

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