![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
徒步的水獭
这个作者很懒,什么都没留下…
展开
-
剑指offer--字符串转换成整数(Java)
题目:将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。知识点:Integer.valueOf(string)的作用:将一个字符串转换成一个整数,但是string不符合数字要求时返回0注意:正负号的考虑,负数用一个标记记录,返回sum时判断即可 最...原创 2019-02-16 18:36:51 · 123 阅读 · 0 评论 -
剑指offer-- 丑数(Java)
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。思路: 直观思路:从1开始逐一判断每个整数是否为丑数,直到找到第n个丑数,时间效率太低。因为对于每一个整数都要计算,即使一个整数不是丑数,也要进行除法和取余操作。 空间换时间的解法: 创建数组存...原创 2019-03-04 11:27:23 · 133 阅读 · 0 评论 -
剑指offer-- 删除链表中重复的结点(Java)
题目:在一个排序的链表中,如何删除重复的结点?思路: 设置一个preNode,用于记录当前结点的前一个结点,如果当前结点和后一结点的值相同(记该值为dupVal),通过循环往后找到第一个不为dupVal的结点,把该结点设置为当前结点,并赋值给preNode.next,即相当于完成了删除操作;而当前结点和后一结点的值不相同时,把当前结点和preNode往后移一位即可。 实现:...原创 2019-03-03 15:45:28 · 179 阅读 · 0 评论 -
剑指offer--包含min函数的栈(Java)
题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。思路: 要定义一个变量存储min值,每次push进一个新的值,随之改变min的值,但是当最小元素弹出时,min变量无法捕捉之前的值,因此定义一个辅助栈来存放最小元素,把每次的最小值都存储下来 栈 3,4,2,5,1 辅助栈 3,...原创 2019-02-26 21:54:52 · 141 阅读 · 0 评论 -
剑指offer-- 找出数组中重复的数字(Java)
题目: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。思路: 从哈希表的思路拓展,重排数组:把扫描的每个数字(如数字m)放到其对应下标(m下标)的位置上,若...原创 2019-03-08 14:59:53 · 698 阅读 · 0 评论 -
剑指offer--用两个栈实现队列(Java)
题目:用两个栈实现一个队列。完成在队列尾部插入结点和在队列头部删除结点的功能。思路: 试着模拟一下插入删除的过程(在草稿纸上动手画一下):插入肯定是往一个栈stack1中一直插入;删除时,直接出栈无法实现队列的先进先出规则,这时需要将stack1中的所又元素出栈,压到另一个栈stack2中,然后再从stack2中出栈就OK了。需要稍微注意的是:当stack2中还有元素,stack1中的元素不...原创 2019-02-26 21:16:38 · 191 阅读 · 0 评论 -
剑指offer-- 链表中环的入口结点(Java)
题目:一个链表中包含环,如何找出环的入口结点?思路: 1.确定链表是否有环:通过两个不同速度的指针确定,当两个指针指向同一个结点时,该链表含有环,并且相遇点在环内。 2.确定环中结点的数目n:指针走一圈,边走边计数 3.找到环的入口:从头结点开始,通过两个相差为n的指针来得到(快指针先走n部,然后快慢指针的相遇点就是环入口节点)考点:代码的鲁棒性实现: public...原创 2019-03-02 21:03:48 · 239 阅读 · 0 评论 -
剑指offer--二叉搜索树的后序遍历序列(Java)
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。思路:二叉树后序遍历数组的最后一个数为根结点,剩余数字中,小于根结点的数字(即左子树部分)都排在前面,大于根结点的数字(即右子树部分)都排在后面。根据遍历数组的这个特性,可以编写出一个递归函数,用于实现题目所要求的判断功能。考点:举例让抽象问题...原创 2019-02-26 18:23:18 · 176 阅读 · 0 评论 -
剑指offer--二叉搜索树的第k大结点(Java)
题目: 给定一棵二叉搜索树,请找出其中的第k小的结点。思路: 二叉查找树的中序遍历结果是节点的从小到大排序序列 设置全局变量index=0,对BST进行中序遍历,每遍历一个结点,index+1,当index=k时,该结点即为所求结点。考点:知识迁移能力实现:int index=0; TreeNode KthNode(TreeNode pRoot...原创 2019-02-26 16:08:03 · 378 阅读 · 0 评论 -
剑指offer-- 求1+2+…+n
题目 求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路 不能使用乘除法,不能使用循环语句、判断语句。可以考虑的有 单目运算符:++和--,双目运算符:+,-,移位运算符<<和>>,关系运算符>,<等,逻辑运算符&&,||,&,|,...原创 2019-05-22 11:23:42 · 107 阅读 · 0 评论 -
剑指offer--不用加减乘除做加法
题目 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。思路 无论是做十进制的加法,还是二进制的加法,都可以用三步走的策略:(1)只做各位相加不进位(2)计算进位(3)把上述结果相加。因此采用二进制的位运算实现三步走的加法运算 1)不考虑进位对每一位相加:1加0,0加1都等于1,而0加0,1加1等于0,所以使用异或^操作; 2)计算...原创 2019-05-23 10:39:16 · 76 阅读 · 0 评论 -
可以用哈希表解决的字符串问题
剑指offer---第一个只出现一次的字符 剑指offer---字符流中第一个不重复的字符原创 2019-07-01 14:18:36 · 161 阅读 · 0 评论 -
常见数据结构的查找、插入、删除时间复杂度
访问 查找 插入 删除 数组 O(1) O(n) O(n) O(n) 有序数组 O(1) O(logn) O(n) O(n) 链表 O(n) O(n) O(1) O(1) 有序链表 O(n) O(n) O(n) O(n) 二叉树查找树 O(logn)...原创 2019-07-04 15:49:51 · 5782 阅读 · 2 评论 -
剑指offer-- 构建乘积数组
题目 给定一个数组A[0, 1, …, n-1],请构建一个数组B[0, 1, …, n-1],其中B中的元素B[i] =A[0]×A[1]×… ×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。思路 无法使用除法,正常连乘的话时间复杂度为O(n^2),效率非常低。 考虑到计算每个B[i]时都会有重复,思考B[i]之间的联系,找出规律,提高效率。 如上图...原创 2019-07-09 10:35:22 · 118 阅读 · 0 评论 -
树:
二叉查找树(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉查找树和堆的区别1、结构上:二叉排序树:左子树小于根节点,根节点又小于右子树。堆(大堆):根节点大于左右子树,但是左右子树没有大小...原创 2019-07-03 10:53:16 · 99 阅读 · 0 评论 -
剑指offer-- 旋转数组的最小数字(Java)
题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路 数组在旋转之后,分为两部分有序的数组,最小的数处在两个有序数组的边界上,由于数组在一定程度上是有...原创 2019-07-08 13:37:17 · 143 阅读 · 0 评论 -
剑指offer--替换空格
题目 请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。思路 首先要询问面试官是新建一个字符串还是在原有的字符串上修改,本题要求在原有字符串上进行修改。 若从前往后依次替换,在每次遇到空格字符时,都需要移动后面O(n)个字符,对于含有O(n)个空格字符的字符串而言,总的时间效率为O(n2...原创 2019-06-22 16:36:55 · 84 阅读 · 0 评论 -
剑指offer-- 第一个只出现一次的字符
题目 在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'。思路 创建哈希表,键值key为字符,值value为出现次数。第一遍扫描:对每个扫描到的字符的次数加一;第二遍扫描:对每个扫描到的字符通过哈希表查询次数,第一个次数为1的字符即为符合要求的输出。 可以使用java中的hashmap,但本题只需要用一个简单的数组即可,由于字符(char)是长...原创 2019-06-21 11:12:37 · 103 阅读 · 0 评论 -
栈和队列总结
栈 队列 特点 后进先出 先进先出 定义 Stack<Object> stack = new Stack<Object>() Queue<Object> queue = new LinkedList<Object>() 入 s.push() q.offer() 出 s.pop(...原创 2019-06-06 09:53:43 · 512 阅读 · 0 评论 -
查找
二分查找:二分查找是一个基础的算法,也是面试中常考的一个知识点。二分查找就是将查找的键和数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找;如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素。如果面试题要求在排序的数组(或者部分排序的数组)中查找数字或者统计某个数字出现的次数,都可以尝试使用二分查找实现(非递归):/** * 二分查找,找到该值在数组中...原创 2019-02-20 22:45:57 · 86 阅读 · 0 评论 -
剑指offer--二叉树的下一个结点(Java)
题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。思路: 首先自己在草稿纸上画图,进行分析(不再展开)。可以发现下一个结点的规律为: 1.若当前结点有右子树时,其下一个结点为右子树中最左子结点; 2.若当前结点无右子树时, (1)若当前结点为其父结点的左子结点时,其下一个结点为其...原创 2019-02-26 14:37:26 · 125 阅读 · 0 评论 -
剑指offer---合并两个排序的链表(Java)
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。思路:1.递归实现:合并过程中,每次都是从两个链表中找出较小的一个来链接,因此可以采用递归来实现,当任意一个链表为null时,直接链接另一个链表即可;其余情况只需要在两个链表中找出较小的一个结点进行链接,该结点的next值继续通过递归函数来链接。 2.非递归实现:非递归实现比较容易想到,直接进...原创 2019-02-18 21:59:45 · 236 阅读 · 0 评论 -
剑指offer---从尾到头打印链表(Java)
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。结点定义如下:class ListNode { int val = 0; ListNode next = null; ListNode(int val) { this.val = val; }}思路1:结点遍历顺序只能从头到尾,但是输出的顺序却为从尾到头,是典型的“后进先出”问...原创 2019-02-18 20:22:40 · 82 阅读 · 0 评论 -
剑指offer---二叉树的镜像(Java)
题目:操作给定的二叉树,将其变换为源二叉树的镜像输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 /...原创 2019-02-18 13:36:27 · 90 阅读 · 0 评论 -
剑指offer---二叉树的深度(Java)
题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:树的深度=max(左子树深度,右子树深度)+1,采用递归实现。class TreeNode{ int val = 0; TreeNode left = null; TreeNode right = null; public T...原创 2019-02-18 11:56:40 · 145 阅读 · 0 评论 -
剑指offer---翻转单词顺序列(Java)
题目:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路:先翻转整个句子,再...原创 2019-02-17 21:47:27 · 197 阅读 · 0 评论 -
剑指offer--左旋转字符串 (Java)
题目:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!思路:把字符串看成两部分,要左移的n位分为一部分,剩下的分为一部分,先翻转第一部分 后翻转第二部分 ...原创 2019-02-17 20:39:39 · 264 阅读 · 0 评论 -
常用排序算法总结
前言:一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序等。面试官对于这些排序可能会要求比较各自的优劣、各种算法的思想及其使用场景。还有要会分析算法的时间和空间复杂度。常见的排序算法有8种:排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) ...原创 2019-02-22 15:15:08 · 153 阅读 · 0 评论 -
剑指offer--字符流中第一个不重复的字符(Java)
题目请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路 字符只能一个一个从字符流中读出来,因此要定义一个容器来保存字符以及其在字符流中的位置。 为尽可能...原创 2019-02-16 19:40:23 · 147 阅读 · 0 评论 -
剑指offer---和为s的两个数字(Java)
题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。思路:从头开始遍历数字,确定一个数字后,对后面的数字遍历,判断和是否为s,这种方法复杂度为O(n^2),效率太低。 设置两个指针,一个指针small从第一个数字(最小)出发,另一个指针big从最后一个数字(最大)出发: 当...原创 2019-02-19 15:18:16 · 85 阅读 · 0 评论 -
剑指offer---和为S的连续正数序列(Java)
题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。思路: 指针法: 用两个指针small和big分别代表序列的最大值和最小值。令small从1开始,big从2开始。 当从small到big的序列的和小于s时,增加big,使序列包含更多数字;(记得更...原创 2019-02-19 16:50:22 · 127 阅读 · 0 评论 -
剑指offer--反转链表(Java)
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。思路: 方法一:使用三个指针(l,cur,r)进行实现(cur为当前遍历到的节点,l为cur的前一个节点,r为cur的后一个节点)。令cur指向l,r则是用于防止链表断裂 注:当前节点从head开始 方法二(递归):找到最后一个结点作为返回值,递归函数中,找到最后的头结点后,开始进行每个结点next...原创 2019-02-26 10:54:18 · 152 阅读 · 0 评论 -
剑指offer---从上往下打印二叉树(Java)
题目:(一)从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。(二)从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。(三)请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。考点:举例让抽象问题具体化,树的遍历思路:(一)不分行从上...原创 2019-02-26 10:09:53 · 161 阅读 · 0 评论 -
剑指offer--数组中只出现一次的两个数字(Java)
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路:记住:两个相同的数字异或等于0. 如果数组中只有一个数字只出现一次,我们从头到尾异或每个数字,那么最终的结果刚好是那个只出现一次的数字。 而本题里数组中有两个数字只出现一次,如果能够将数组分为两部分,两部分中都只有一个数字只出现一次,...原创 2019-02-20 15:42:59 · 561 阅读 · 0 评论 -
剑指offer算法部分
递归和循环:递归:定义:在一个函数的内部调用这个函数自身 优点:代码简洁 缺点:1.函数调用有时间和空间的开销,空间上:在内存栈中分配空间以保存参数,返回地址以及临时变量;时间上:数据的弾入和弹出都需要时间 2.递归中可能很多计算都是重复的(递归的本质是把一个问题分解成两个或多个问题),小问题存在相互...原创 2019-02-20 11:47:51 · 85 阅读 · 0 评论 -
剑指offer--链表中倒数第k个结点(Java)
题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点思路:第一直觉是先从头开始遍历,计算链表个数n,然后重新遍历,第n-k+1个结点即为所需要的结点。但是需要遍历2次。也可以使用栈来解决。书中的方法则是:设置两个指...原创 2019-02-25 21:20:28 · 162 阅读 · 0 评论 -
剑指offer--在O(1)时间删除链表结点(Java)
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。思路: 通常那样从头开始查找删除需要的时间为O(n) 要在O(1)时间删除某结点,可以这样实现:设待删除结点i的下一个结点为j,把j的值复制到i,再把i的指针指向j的下一个结点,最后删除j,效果就相当于删除j。 注意特殊情况:1.当待删除结点i为尾结点时,无下一个结点,则只能从头到尾顺序遍历;2....原创 2019-03-01 10:39:03 · 332 阅读 · 0 评论 -
剑指offer--斐波那契数列及青蛙跳台阶问题(Java)
题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。思路:如果直接写递归函数,由于会出现很多重复计算,效率非常底,不采用。public int Fibonacci1(int n) { if (n <= 0) return 0; if (n == 1) return 1; return Fibonacci1(n-...原创 2019-02-19 21:12:09 · 285 阅读 · 0 评论 -
剑指offer--两个链表的第一个公共结点(Java)
题目:输入两个链表,找出它们的第一个公共结点。思路:蛮力法:遍历第一个链表的结点,每到一个结点,就在第二个链表上遍历每个结点,判断是否相等。时间复杂度为O(m*n),效率低,注意新一轮循环要将链表指向头部; 使用栈:由于公共结点出现在尾部,所以用两个栈分别放入两个链表中的结点,从尾结点开始出栈比较。时间复杂度O(m+n),空间复杂度O(m+n)。 利用长度关系:计算两个链表的长度之差,长链...原创 2019-02-28 23:02:16 · 185 阅读 · 0 评论 -
剑指offer-- 对称的二叉树(Java)
题目 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。思路如果一个树的左子树与右子树镜像对称,那么这个树是对称的。因此,该问题可以转化为:两个树在什么情况下互为镜像?如果同时满足下面的条件,两个树互为镜像:它们的两个根结点具有相同的值。 每个树的右子树都与另一个树的左子树镜像对称。实现 boole...原创 2019-08-01 11:13:25 · 251 阅读 · 1 评论