
剑指offer java版
1.扎实的基础知识(编程语言,算法,数据结构)
2.高质量代码(没有bug,异常处理)
3.能分析和解决复杂问题
4.从时间和空间复杂度方面优化算法效率
5.沟通能力,学习能力,发散思维能力
wellwang1993
这个作者很懒,什么都没留下…
展开
-
剑指offer面试题42 翻转字符顺序 VS 左旋字符串
类似这种题目只能观察元素特点找出规律确定算法了,像第一道题目翻转单词顺序,我们可以很容易的得到翻转每个字符后的的字符串,再仔细观察一下紧接着以空格为间隔分别翻转俩边的字符串就可以解这道题目了。第二题要求左旋字符串,同样首先翻转整个字符序列,然后以位数为间隔分别翻转俩边的字符序列即可解这道题目。原创 2024-03-23 19:53:16 · 196 阅读 · 0 评论 -
剑指offer面试题41 和为s的俩个数字 vs 和为s的连续正数序列
第一道题目要求和为s的俩个数字,且数组是排序的,遇到这类排序的题目一定要往二分的思维上靠,我们可以先求最小值和最大值的和,且俩个指针分别指向最小值和最大值,如果和比s大那么最大值的指针减1,反之最小值的指针加1,这样通过o(n)的复杂度就可以拿到结果。第二道题目要求和为s的正数序列,这道题目思路是一样的,同样可以用俩个指针,分别指向元素为1和2开始,且最小元素的指针不能超过s的一半,因为超过一半就不是俩个数了。开始遍历的时候如果和比s小那么不断后移最大指针,当比s大的时候则后移最小指针。原创 2024-03-21 23:10:11 · 200 阅读 · 0 评论 -
剑指offer面试题40 数组中只出现一次的数字
本题目要求数组中只出现一次的俩个数字,并且要求O(1)时间复杂度和空间复杂度。试想一下如果只有一个数字出现一次,那么针对全部元素做异或运算就可以了,因为相同元素异或为0。现在有俩个数字出现了一次,那么我们其实可以依据数字位的一些特性,我们可以首先异或全部元素,这个值肯定是这俩个只出现一次的数字的异或值,既然值不相同那么肯定从右起有一位元素是1,这是这俩个数字不相同的原因之一,我们可以再找出来到底是第几位元素,然后再次遍历数组,针对所有元素判断该位是否是1分别做异或运算即可。原创 2024-03-20 22:43:55 · 240 阅读 · 0 评论 -
剑指offer面试题39 二叉树的深度
本题目要求二叉树的深度,遇到树的题目思维肯定要往递归的方向上靠,假如左子树的深度和右子树的深度都求出来了,如何求根结点的深度?肯定是左右子树深度最大值+1,那么这道题目的算法也就出来了。原创 2024-03-19 22:57:24 · 101 阅读 · 0 评论 -
剑指offer面试题38 数字在排序数组中出现的次数
一旦提到在一个排序数组中查找一个数字,思维一定要往二分查找上靠,它可以将时间复杂度缩短至log(n),这道题目问一个元素在一个排序数组中出现的次数,试想一下如果我们能通过二分法找到这个元素第一次出现的位置以及最后出现的位置,相减就可以拿到该元素出现的次数了。原创 2024-03-18 23:58:55 · 121 阅读 · 0 评论 -
剑指offer面试题37 俩个链表的第一个公共结点
题目要求俩个链表第一个公共结点,最简单的办法就是俩个for循环依次遍历俩个链表,这种时间复杂度会很高。针对链表的题目,我们应该好好观察链表自身的特点再决定算法,假设俩个链表长度一样,同步开始往后一次遍历俩个链表就可以很快拿到公共结点,所以我们需要解决的问题是如何让这俩个长度不一的链表变成一样的,这个就很简单了,我们分别求出俩个链表的长度并且求出diff,然后让更长的那个链表先往后遍历diff步,这样俩个链表长度就一样了。原创 2024-03-17 23:37:39 · 239 阅读 · 0 评论 -
剑指offer面试题36 数组中的逆序对
本题目要求数组中的逆序对,比如数据序列7,5,6,4中类似<7,5>,<6,4>这种就叫逆序对,最简单的办法就是依次比较每个元素和其它序列的大小来确定,但是这样的复杂度太高。所以通过这里的分析可以发现,一对排好序的2个子序列可以非常高效的确定逆序对的个数,这个时候我们的思维一定要想到归并排序,因为归并排序本身做的一个事情就是先俩俩拆分,然后俩个子序列依次排序合并成一个有序序列,然后再合并,所以在归并排序的过程中我们就可以得到逆序对的个数了。原创 2024-03-16 23:27:33 · 282 阅读 · 0 评论 -
剑指offer面试题35 第一个只出现一次的字符
这道题目求字符串中第一个只出现一次的字符,如果我们循环遍历字符串,依次和其余字符比较,这样的时间复杂度非常长。类似这种题目思维一定要想着如何能够拿空间换时间。如果我们能有一个哈希表,key对应字符串中每个字符信息,value对应它出现的次数,那么当统计出每个字符的次数以后,再遍历一遍就能拿到第一个只出现一次的字符了,俩次O(n)遍历就可以搞定。java字符用的是Unicode编码,每个字符占用2个字节,要想覆盖到全部字符,需要一个长度为65536的int类型的数组,就可以充当这个哈希表的角色。原创 2024-03-13 23:27:20 · 161 阅读 · 0 评论 -
剑指offer面试题34 丑数
这里面其实用到了一点点的数学知识,丑数的定义是只包含2,3,5因子的数。我们需要想一个高效的算法,这里同样用到一点数学知识,按照题目的定义丑数一定是丑数的2,3,或者5倍,所以可以看出最新的丑数和历史的丑数是有关系的,所以我们其实可以把历史的丑数都存起来,每次在求新的丑数的时候都求一遍历史丑数的2,3,5倍并且取这里面的最小值就是最新的丑数(前提是不能重复)。原创 2024-03-12 23:39:27 · 181 阅读 · 0 评论 -
剑指offer面试题33 把数组排成最小的数
这道题目我们大可以通过排列的方式枚举出所有的数字然后求一个最小的,只不过这种方式时间复杂度非常高。接下来我们通过举例的方式观察我们的思维和数字规律:假如数组有3个元素12,23,34,我们的正常思路肯定是依次遍历元素,观察俩俩元素之间谁放在前面组成的数字更小就把哪个元素放在那个元素的前面,比如我们发现1234要比3412小,所以12这个元素肯定在34的前面,所以其实这就是个快排的思维,只不过比较元素的方式变了,不再是简单的直接比较俩个元素的大小,而是比较俩个元素拼接后的大小。原创 2024-03-11 23:55:40 · 332 阅读 · 0 评论 -
剑指offer面试题32 从1到n整数中1出现的次数
剩下位数总共4位,每一位都可以固定为1,同时剩余位数的可能是0~9 10个数字,而且一定要记得和最高位相乘,因为最高位不同的时候整个值也不一样,最后递归处理其它数据即可。这道题目要求1到n整数中1出现的次数,最简单的算法就是从1开始依次遍历到n,然后求每个数中1的个数(不停求余然后向右移位),这种算法的时间复杂度是O(nlogn),有没有更简单的算法呢?这种只有数字的题目思维一定要往针对每个位数处理上靠以及递归处理,比如21345这个数字,其实我们可以依次递归处理21345(1346。原创 2024-03-10 23:29:03 · 278 阅读 · 0 评论 -
剑指offer面试题31连续子数组的最大和
本题目要求连续子数组的最大和,遇到这种问题,思路都是一样,通过归纳法找到规律,再用算法描述出来。连续数组1,-2,3,10,-4,第一个第二个元素累加起来已经是-1了,在加第三个元素(无论是正数还是负数)的和肯定要比第三个元素本身要小,所以发生子数组的和小于0的时候就要重新考虑新的子数组了。原创 2024-03-10 20:13:14 · 118 阅读 · 0 评论 -
剑指offer面试题30 最小的k个数
题目要求一个序列中最小的k个数,最简单的方法就是对整个数组进行排序,找到最小的k个,而排序算法最快也需要o(nlogn)。我们要求最小的k个数,其实可以等价替换为求坐标为k-1的元素,且该元素前面的元素都比它小(这部分元素可以是无序的),后面的都比它大,其实就可以了。考虑到快排中有一个partion算法,能够很好的解决这个问题,整个时间复杂度为O(n)原创 2024-03-09 21:10:13 · 202 阅读 · 0 评论 -
剑指offer面试题29 数组中出现次数超过一半的数字
本题目要求数组中出现次数超过一半的数字,其实是需要有一点数学思维,遍历数组,假设第一个元素就是超过一半的元素,并且记录元素出现的次数times,当遇到跟他一样的元素的时候times++,不一样的时候times–,直到times=0的时候可以暂时说明这个元素出现的次数肯定不是超过一半的,超过一半的元素最终times一定是大于0的那个。原创 2024-03-09 19:53:11 · 343 阅读 · 0 评论 -
剑指offer面试题28 字符串的排练
题目要求打印字符串的全排列,对于这种问题我们可以对问题进行拆解,试想一下第一个位置的元素依次和后面的元素进行位置交换,那么第一个位置的全排列就已经有了,这个时候再去递归考虑后面的,即交换第二个位置的元素和它后面的部分,直到字符串末尾。原创 2024-03-07 22:42:45 · 125 阅读 · 0 评论 -
剑指offer面试题27 二叉搜索树与双向链表
题目要求把一颗二叉搜索树转换成排序的双向链表,二叉搜索树和双向链表一样都有2个指针,唯一的区别就是对于树来说一个结点具有左子树右子树,对于双向链表来说是直接前驱和直接后驱。应该很自然的想到中序遍历一颗二叉搜索树就是一个有序序列,结合中序遍历的特性,当我们遍历到一个结点的时候,该结点的左子树部分一定遍历好了,但是右子树部分还没有开始,所以这个时候我们能修改的一定是这个结点的左子树指针,该指针一定指向左子树中值最大的那个结点,而这个值最大的结点的右子树指针一定指向当前这个结点。原创 2024-03-06 23:10:42 · 245 阅读 · 0 评论 -
剑指offer面试题26 复杂链表的复制
这道题目最直观的解法就是先把含有next指针的链表复制出来,然后再次遍历链表设置第二个指针,方法是判断下第二个指针指向的结点距离当前结点的距离,在最新的链表上按照这个距离设置即可,这种方式非常消耗时间复杂度。其实这种方式没有充分利用第二个指针。假设链表为1-2-3-4-5,我们可以在原链表上直接复制1-1’-2-2’-3-3’-4-4’-5-5’,然后如果1的第二个指针指向了3,那么让1’的第二个指针非常好设置即3的next,最后再把这个最新的指针拆开即可。原创 2024-03-05 23:23:26 · 263 阅读 · 0 评论 -
剑指offer面试题22 二叉树中和为某一值的路径
题目中树的路径的定义是从根结点开始一直到叶子结点形成的一条路径,所以最先遍历的结点一定是根结点,假设遍历完10,5,4,接下来应该要遍历10,5,7了,这个时候能发现10,5都还在,同样10,5,4和10,5,7都遍历完遍历10,12的时候,10还在,因此我们需要一个数据结构来存这些数据,而观察数据发现是最先进去的数据最后出来,因此用栈最合适不过了,在左子树遍历完开始遍历右子树的时候需要把左子树的元素都弹出去,这样才能保证左右子树的根结点到右子树组成一个新的路径。原创 2024-03-05 00:09:42 · 269 阅读 · 0 评论 -
剑指offer面试题24 二叉树搜索树的后续遍历序列
又因为这颗树是一颗二叉搜索树,那么二叉搜索树的特点就是左子树一定比根结点小,右子树一定比根结点大,我们利用好这个特点就可以很好的判断这个序列是否满足需求了,我们可以先遍历序列找到第一个比根结点大的元素,可以确定的是如果这个序列是后序遍历序列的话那么这个元素开始往后的元素一定都比根结点要大,一旦出现比根结点小的就可以断定这个序列不符合需求。然后我们递归处理这个序列即可。同时遍历的时候一定要注意根结点已经遍历过了,每次遍历都要把根结点去掉。原创 2024-03-03 22:11:39 · 230 阅读 · 0 评论 -
剑指offer面试题23 从上往下打印二叉树
题目要求从上到下打印二叉树,类似这种题目的思路就是用归纳法,通过一些例子找到数据的规律找一个合适的数据结构,这道题目很明显不能按照树的三种遍历方式去解,要按照6,10,5,7,9,11的顺序遍历,5和7是6的子结点,9和11是10的子结点,也就是说需要先遍历完父结点,再遍历子结点,同时在遍历父结点的时候要先把子结点存到这个数据结构里面,同时要求先入先出,那么很明显这个结构就是队列。原创 2024-03-02 23:47:53 · 396 阅读 · 0 评论 -
剑指offer面试题22 栈的压入弹出序列
当我们拿第二个序列的某个元素,去第一个序列里面找结果没找到,这肯定能说明答案就是不是,所以我们只需要正常遍历第二个序列的数据,依次去看这个数据是否存在于第一个序列中,这个过程也需要遍历第一个序列的数据,如果遍历完了发现不存在那就可以证明不是,由于栈具有先入后出的特点,所以在遍历第一个序列的时候一直到找到指定数据前面的数据都需要先入栈,到这一步就引出了我们的算法需要考虑的另外一个点,遍历第一个序列之前需要先判断栈顶的数据是否是正要找的那个数据,如果不是才需要再去遍历第二个序列。原创 2024-03-01 00:02:21 · 280 阅读 · 0 评论 -
剑指offer面试题21 包含min函数的栈
题目需要一个能够得到栈的最小元素的min函数,并且min函数,pop,push都要求是O(1)的时间复杂度。遇到栈思维要往双栈上考虑,这种情况一个栈肯定完成不了,需要一个辅助栈,既然要求 O(1)时间内拿到最小元素,那么这个辅助栈的栈顶存的肯定是当前所有元素中最小的元素,所以只要每次入栈的时候取当前元素和辅助栈顶层数据最小值入栈即可。切记注意辅助栈需要和数据栈一起增长,这样当数据栈弹出的时候辅助栈的栈顶数据依然是所有元素中最小的元素。原创 2024-02-28 23:33:20 · 285 阅读 · 0 评论 -
剑指offer面试题20 顺时针打印矩阵
那么接下来需要考虑的是如何打印每一圈数字,从左往右直接打印即可,从上到下打印是有条件的,即start需要小于数圈对应的纵坐标(如果不小于则最中间那个圈可能是个点或者一行数字),从右往左打则要求start小于数圈对应的纵坐标,和横坐标(如果不小于则最中间那个圈可能是个点或者一列数字),从下往上打则要求start小于数圈对应的纵坐标-1(如果不小于可能是一行数字),和横坐标(如果不小于可能是个点)个人认为面试不太会可能考这种题目,不具有代表性。原创 2024-02-28 00:04:30 · 253 阅读 · 0 评论 -
剑指offer面试题19 二叉树的镜像
我们分析算法题目的思路基本上都是归纳法,即通过举一些普通的例子来推理出算法流程,而画图又是举例子的常用手段,比如针对树或者链表画画图,针对数字类的举一些数字的例子寻找规律,很快就能得到解决问题的方案。这道题目要求树的镜像,只要谈到树我们的思维就往那几个遍历上靠,前序遍历树的过程中交换非叶子结点的左子树和右子树就可以了。原创 2024-02-25 20:16:24 · 298 阅读 · 0 评论 -
剑指offer面试题18 树的子结构
本题目要求判断树B是否是另外一颗树A的子结构,按照正常的递归思维就可以解决这道题目。首先要求这俩颗树的根结点必须一样,所以如果树A的根结点和树B的根结点不一样了则需要递归树A去找到和树B根结点一样的子树,找到以后再去递归判断这俩个树的左子树和右子树是否完全一致。原创 2024-02-24 20:53:51 · 343 阅读 · 0 评论 -
剑指offer面试题17 合并俩个排序的列表
题目要求合并俩个排序的列表,很自然的可以想到从俩个链表的头结点开始比较,假设a链表的头结点比b链表的头结点小,那么a链表的头结点就是合并后链表的头结点,接下来也是很自然的可以想到要确定这个合并链表头结点的后继结点,a链表的头结点已经排好序了,b链表的头结点还没有确定好位置,因此再接着比较a链表头结点的后继结点和b链表的头结点,这个过程可以通过递归的方式完成。原创 2024-02-21 23:23:17 · 380 阅读 · 0 评论 -
剑指offer面试题16 反转链表
关于链表的考点其实就是一个遍历问题,要么是双指针遍历,要么是三指针遍历,而三指针遍历往往是最前面的指针初始化为空,中间指针初始化为头结点,第三个指针初始化为头结点的next结点。类似这种题目我们往往需要通过归纳法的手段找出规律:假设链表a->b->c,现在要想改成a<-b,是不是需要先把c结点存起来,否则b到c的链路就断掉了,因为我们可以针对链表中每个结点重复此过程,直到尾结点,这里一定要注意尾结点的处理方式,找到尾结点以后需要把它变成头结点。原创 2024-02-20 23:26:35 · 338 阅读 · 0 评论 -
剑指offer面试题15 链表中倒数第k个结点
有没有只遍历一次链表的方法呢?肯定有,链表的考点一般会考到双指针,所以思维一定要往双指针上靠,通过第一种方法能够看到倒数第k个结点就是正数第n-k+1个结点,最后那个结点是正数第n-1个结点,俩个结点相差n-1-(n-k+1) = k-2个步,按照这个思路,如果我们先让其中一个指针从头结点开始往后走k-2步,然后让第二个指针从头结点开始和第一个指针同时往后遍历,当快指针遍历到最后一个结点的时候,慢指针所指的结点就是我们要寻找的结点。原创 2024-02-20 00:04:12 · 130 阅读 · 0 评论 -
剑指offer面试题14 调整数组顺序使奇数位于偶数前面
要求奇数位于偶数前面,如果按照循环遍历的方式,可以每找到一个偶数就把该数字后面所有的数都往前移动1位,然后把该偶数放在最后空出来的位置,这样的时间复杂度是O(n^2)。由于只要求奇数位于偶数前面,同时为了降低时间复杂度,思维一定要往双指针上靠,双指针有快慢指针的形式也有头尾指针的形式,双指针遍历数组可以大大提升遍历效率。放在本题目中,用头尾指针就可以满足诉求,头指针不断后移直到找到一个偶数,尾指针不断前移直到找到一个奇数,交换二者位置,循环进行该过程直到头指针和尾指针相遇。原创 2024-01-30 23:46:31 · 350 阅读 · 0 评论 -
剑指offer面试题13 在O(1)时间删除链表结点
我们都知道链表删除往往需要O(n)遍历链表,找到待删除结点的前置结点,把前置结点的next指针指向待删除结点的后置结点。现在要求O(1)时间删除,那肯定不能用遍历的办法了,试想一下一个结点包括一个值和指向下一个结点的指针,如果把待删除结点的后置结点的值复制到待删除结点这里,然后删除掉待删除结点的后置结点其实就相当于把待删除结点删除掉了。其中有俩个特殊场景需要注意:如果待删除的结点是尾结点则只能按照遍历的方式删除,如果待删除的结点是头结点则在删除的时候也需要把头结点置空。原创 2024-01-30 00:00:18 · 342 阅读 · 0 评论 -
剑指offer面试题12打印1到最大的n位数
这道题目唯一需要考虑的点就是n很大的时候会存在数字溢出的情况,因此这种肯定属于大数问题,大数问题就是用字符串表示数字。题目要求从1打印到最大的n位十进制数,其中必不可少的运算就是加法和打印,只要想一想我们普通加法是如何实现的,这个算法不难实现。原创 2024-01-29 23:16:29 · 121 阅读 · 0 评论 -
剑指offer面试题10 二进制中1的个数
要求二进制中1的个数,这个时候思维一定要往位运算上靠,如果二进制位与数字1做与运算还是1的话那就肯定能说明这个二进制位是1,我们遍历这个数字的二进制序列就能够统计出1的个数了。有俩种很直观的思路,第一种思路不断右移该数字并且让该数字与1做与运算直到该数字为0为止,右移最右边不断补0因此这个数字最终肯定会变成0,如果用普通右移的话这个思路的前提是这个数字一定不能是负数,如果是负数的话要陷入死循坏了,当然用无符号数右移也是可以满足诉求的。原创 2024-01-28 20:24:32 · 295 阅读 · 0 评论 -
剑指offer面试题11 数值的整数次方
这道题目是一道比较常规的题目,把异常输入,各种可能的输入都考虑到就可以了。要考虑到指数和基数同时为正,同时为负,指数为正基数为负以及指数为负基数为正的情况。原创 2024-01-28 22:06:15 · 114 阅读 · 0 评论 -
剑指offer面试题9 斐波那契数列
是很典型的大问题可以分解成同类小问题这类题目。遇到这类问题我们就要思考是用递归还是迭代的方法去解,递归往往更简单,侧重于描述问题,f(n)可以用f(n-1)和f(n-2)计算出来,迭代效率更高,从f(1)开始如何可以推导出f(n)原创 2024-01-24 23:28:04 · 353 阅读 · 0 评论 -
剑指offer面试题8 旋转数组的最小数字
二分法需要首尾俩个指针以及中间元素,可以肯定的是如果中间元素比最左边的值大那说明最小值肯定在右边(左边的小递增数组特性),如果中间元素比最右边的值小那说明最小值肯定在左边(右边的小递增数组特性),到这一步的时候就需要拿数字举例一下看到底应该怎么找到最小值,最终举例完以后会发现按照上面的思路最终左边的指针和右边的指针相差1的时候,右边的指针指向的就是最小的元素(在解题没有思路的时候拿实际数据算一下然后找出其中的规律,我们的算法说白了就是把这个规律用程序表达出来)。(末尾附上二分查找代码)原创 2024-01-23 22:58:46 · 614 阅读 · 0 评论 -
剑指offer面试题7 用俩个栈实现队列
这种题目只能是通过举例子的方式摸索出可能的解法,然后总结出步骤,用语言实现即可。回归到数据结构的特性,考的无非就是队列先进先出,栈先进后出的特点,我们举例子假设元素以a,b,c顺序入栈1,按照栈的逻辑出的元素顺序应该是c,b,a,要想以a,b,c的顺序出栈,只能先把最先出去的元素存起来,题目中刚好给了2个栈,也就是说我们以c,b,a的元素顺序存到了栈2,这个时候栈2出的元素顺序就刚好满足我们的诉求了。总结出来的步骤就是如果入栈直接入栈1,如果出栈直接出栈2,要是栈2是空的则把栈1的元素弹出压进去。原创 2024-01-21 21:06:16 · 588 阅读 · 0 评论 -
剑指offer面试题6 重建二叉树
这里需要了解到程序中有个特别重要的思维叫递归,递归是分层的,每一层的问题都是一样的,只不过问题的规模不一样,面对这类复杂问题你的思考方式一定是2点:1.问题该如何定义?2.第0层的问题是怎么样的该怎么解决。前序遍历第一个元素就是根结点,而中序遍历左根右如果能找到根结点在中序序列中的位置,那么就能确定该根结点左边的所有结点都是左子树的中序序列,右边的所有结点都是右子树的中序序列,结点数目知道了以后再返回前序遍历找出左子树的前序序列和右子树的前序序列,这样一来就可以继续用这个方法去分别构建左子树和右子树。原创 2024-01-17 23:32:44 · 486 阅读 · 0 评论 -
剑指offer面试题5 从尾到头打印链表
题目要求从尾到头打印链表,我们熟知链表的遍历是从头结点开始,通过链表中每个结点存储的下一个结点的地址依 次向后访问每个元素,即使有再多种解题方法一次对链表的遍历肯定是少不了的,仔细思考遍历元素和打印元素是俩回事,可以在不同的时间段进行,遍历完一遍肯定可以拿到链表的正向序列,我们可以把它按序存储到某个有序的数据结构里面,然后再通过O(n)的方式从尾到头打印即可满足题目需求,java中ArrayList是有序的。(代码中实现了链表最基本的增加结点,删除结点,正向遍历结点方法)原创 2024-01-14 22:39:56 · 514 阅读 · 0 评论 -
剑指offer面试题4 替换空格
关于字符串的考点无非就是字符串的遍历以及关于字符串类型本身提供的方法,后者其实主要考察你对语言本身是否足够熟悉,比如java语言中String类型支持哪些方法,这个太具体了,不太符合对抽象的数据结构和算法的考察标准。这个时候一定要聚焦于数据结构自身的特性,观察字符串本身,遍历方式无非就是从前往后,或者从后往前,第一个方案不行那就考虑第二个方案,从后往前遍历一定要清楚字符串的总的大小,这样才能保证后面的字符不会被覆盖掉。如果我们能把字符串中空格的数目算出来,这样总的字符数目也就清楚了。原创 2024-01-09 23:43:48 · 595 阅读 · 0 评论 -
剑指offer面试题3 二维数组中的查找
剑指offer java版 题目分析和代码原创 2024-01-07 23:50:30 · 677 阅读 · 0 评论