剑指Offer
Ethan_pika
一个爱养花的程序员
展开
-
面试题5:替换空格
题目该系列文章题目和思路均参考自:《剑指Offer》解法思路1:时间复杂度为O(n*n)的解法。从头到尾遍历字符串,遇到空格时将后续的字符串后移2位,然后替换空格为%20。这种方式的时间复杂度为O(n*n)。思路2:时间复杂度为O(n)的解法。首先遍历一遍数组,计算空格字符的个数,然后扩充字符串的长度为:原始的长度+空格的个数x2。 使用两个指针,p1指向原始的字符串...原创 2019-03-29 20:55:38 · 189 阅读 · 0 评论 -
面试题13:机器人的运动范围
题目该系列文章题目和思路均参考自:《剑指Offer》- Page 92解法与题目11类似,可以将方格看做一个mxn的矩阵。依然使用回溯法求解。在这个矩阵中,除边界上的格子之外,其他格子都有4个相邻的格子。机器人从坐标(0,0)开始移动,当他准备进入坐标(i,j)的格子时,通过检查坐标的数位和来判断机器人能够进入,如果机器人能够进入坐标为(i,j)的格子,则在判断它能否进入4个...原创 2019-04-16 22:47:16 · 122 阅读 · 0 评论 -
面试题22:链表中倒数第k个节点
题目该系列文章题目和思路均参考自:《剑指Offer》- Page 134解法思路:只需要遍历一次链表的思路,就是使用两个指针,第一个指针指向头结点,第二个指针指向头结点后面的第k个节点。然后同时移动两个指针,当第二个指针指向了链表末尾时,那么第一个指针的位置就是倒数第k个节点的位置。返回第一个指针指向的节点即为所求。代码实现: private static ...原创 2019-04-23 00:21:03 · 89 阅读 · 0 评论 -
面试题23:链表中环的入口节点
题目该系列文章题目和思路均参考自:《剑指Offer》- Page 139解法思路:解决这个问题的思路首先是如何确定一个链表中有环。这个问题,我们可以使用快慢指针的方法,两个指针初始化都在链表头节点,然后一个(slow)一次走一步,另一个(fast)一次走两步。如果两个指针能够在某个地方相遇,则说明链表中包含环。在确定了链表中包含环之后,第二步是找到环的入口节点。在上述过程...原创 2019-04-23 17:00:31 · 123 阅读 · 0 评论 -
面试题24:反转链表
题目该系列文章题目和思路均参考自:《剑指Offer》- Page 142解法 public static ListNode reverseList2(ListNode head) { ListNode newHead = head; ListNode cur = head; ListNode prev = null; ...原创 2019-04-23 17:20:50 · 135 阅读 · 0 评论 -
面试题14:剪绳子
题目该系列文章题目和思路均参考自:《剑指Offer》- Page 96解法动态规划算法自底向上的动态规划算法。定义f(n)为把长度为n的绳子剪成若干段后各段长度乘积的最大值。在剪第一次时,有n-1种可能的选择,也就是剪出来的第一段绳子可能长度为1,2,...,n-1。因此,f(n)=max(f(i)*f(n-i))。这是一个从上到下的递归公式,由于递归会有很多重叠子问...原创 2019-04-18 22:26:13 · 306 阅读 · 0 评论 -
面试题15:二级制中1的个数
题目该系列文章题目和思路均参考自:《剑指Offer》- Page 100解法思路:把一个整数减去1,在和原来的整数做&运算,会把该整数最右边的1变成0。那么对于一个整数,能做多少次这种运算,则它二进制中的1就有多少个。代码实现: private static int countOneBit(int number) { int count ...原创 2019-04-19 21:07:49 · 170 阅读 · 0 评论 -
面试题16:数值的整数次方
题目该系列文章题目和思路均参考自:《剑指Offer》- Page 110解法这个问题看似很简单,但其中需要考虑的点如下:0的0次方没有意义,返回0或1需要进行设置。 底数base不为0时,指数为正则循环相乘求解。 底数base不为0时,指数为负,则需要先将指数取绝对值,然后取乘积的倒数,得到结果。 任何数的0次方都是1。 对于double和float数值,不能够使用...原创 2019-04-19 21:15:04 · 172 阅读 · 0 评论 -
面试题17:打印从1到最大的n位数
题目该系列文章题目和思路均参考自:《剑指Offer》- Page 114解法对于这道题需要解决的是大数的问题,不能简单的使用int或long类型进行数据存储。这里使用字符数组表示大数。在用字符数组表示一个数字的时候,直观的方式就是使用字符数组中的每位表示数字中对应位置的数字。因为数字最大是n位,所以初始化一个n位的字符数组用于存储,n位可以表示的各个数字。需要注意的时,需...原创 2019-04-20 11:16:44 · 180 阅读 · 0 评论 -
面试题21:调整数组顺序是奇数位于偶数前面
题目该系列文章题目和思路均参考自:《剑指Offer》- Page 129解法思路1:看到该问题,如果对快速排序的循环不变式比较熟悉的话,就很容易想到快速排序中的partition方法,其中就是对数组根据不同的条件进行划分的过程。在快速排序中,三个指针将数组划分为三个区域,其中r指向数组最后一个元素,i初始指向数组开始的前一个元素,j指向数组中待排序的元素。因此它的循环不变...原创 2019-04-21 18:14:59 · 159 阅读 · 0 评论 -
面试题20:表示数值的字符串
题目该系列文章题目和思路均参考自:《剑指Offer》- Page 127解法原创 2019-04-21 16:55:39 · 104 阅读 · 0 评论 -
面试题6:从尾到头打印链表
题目该系列文章题目和思路均参考自:《剑指Offer》解法思路1:首先想到的是反转链表后进行顺序打印,但这样会修改输入的链表结构。若题目要求不允许修改输入链表的结构,则这种方法不可行。思路2:使用栈进行实现。思路3:既然想到了栈,递归本身就是维护了一个栈结构,可以直接使用递归实现。代码实现public class PrintListReversely { ...原创 2019-03-29 21:21:45 · 157 阅读 · 0 评论 -
面试题7:重建二叉树
题目该系列文章题目和思路均参考自:《剑指Offer》解法通过上述的方式找到左右子树的根节点,然后可以使用递归分别构建左右子树。代码实现二叉树的结构仍然使用之前的结构:public class BSTreeNode { private int value; private BSTreeNode left; private BSTreeNo...原创 2019-03-29 22:27:48 · 134 阅读 · 0 评论 -
面试题8:二叉树的下一个节点
题目该系列文章题目和思路均参考自:《剑指Offer》解法图中实线表示父节点指向孩子的指针,虚线表示孩子节点指向父节点的指针。给定一个节点,找到中序遍历中它的后一个节点需要考虑如下三种情况:如果这个节点有右子树,那么他的下一个节点就是它右子树中最左的一个孩子。 如果这个节点没有右子树,并且它是它父节点的左孩子,那么他的下一个节点就是它的父节点。 如果这个节点没有右子树...原创 2019-03-30 21:49:20 · 110 阅读 · 0 评论 -
面试题9:用两个栈实现队列
题目该系列文章题目和思路均参考自:《剑指Offer》解法使用两个栈实现一个队列的插入和删除的操作,插入和删除的实现思路如下:插入操作,插入一个元素即可以直接将他入stack1栈。 删除操作,如果stack2为空,则将stack1中的元素全部出栈并入stack2,然后pop出第一个元素。如果stack2不为空,则直接弹出stack2中的第一个元素即可。代码实现:...原创 2019-03-30 20:56:21 · 232 阅读 · 0 评论 -
面试题10:斐波那契数列
题目1该系列文章题目和思路均参考自:《剑指Offer》解法思路1(效率较低的思路):使用递归求解斐波那契数列是很常见的写法,但这种递归方式效率较低,因为在计算的过程中包含了很多重复元素的计算。例如计算n=10时的计算过程如下:代码实现:public static long fibonacciRecursion(int n) { if (n == 0 ...原创 2019-03-30 20:53:29 · 762 阅读 · 0 评论 -
面试题11:旋转数组的最小数字
题目该系列文章题目和思路均参考自:《剑指Offer》解法思路1:求解一个数组中的最小元素,很容易想到进行遍历即可,时间复杂度为O(n)。但这种方式没有用到题目中给的数组旋转的特点。思路2:类似于二分查找法。使用两个指针分别指向数组头(p1)和尾(p2),然后查找到两个指针中间的元素,如果中间的元素位于前面递增的子数组中,那么它应该大于等于p1指向的元素,那么数组中最小的元素...原创 2019-03-30 20:39:34 · 221 阅读 · 0 评论 -
《剑指Offer》面试题整理
2.3 数据结构面试题3:数组中重复的数字 面试题4:二维数组中的查找 面试题5:替换空格 面试题6:从尾到头打印链表 面试题7:重建二叉树 面试题8:二叉树的下一个节点 面试题8:二叉树的下一个节点2.4 算法面试题10:斐波那契数列 面试题11:旋转数组的最小数字 面试题13:机器人的运动范围 面试题14:剪绳子 面试题15:二级制中1的个数3.3 代码的完整性...原创 2019-04-16 22:11:19 · 167 阅读 · 0 评论 -
面试题3:数组中重复的数字
题目描述该系列文章题目和思路均参考自:《剑指Offer》解法思路1:对数组进行排序,例如使用快速排序(O(nlgn)),然后对数组进行遍历,判断当前元素与之后的元素是否相等,如果相等即为重复的元素。这种方式简单容易首先想到,但时间复杂度较高。思路2:使用HashMap,遍历数组然后对每个元素判断Map中是否已经包含该元素。如果已经包含,即为重复元素。这种方式的时间复杂度为O...原创 2019-03-28 21:54:03 · 176 阅读 · 0 评论 -
面试题4:二维数组中的查找
题目该系列文章题目和思路均参考自:《剑指Offer》例如从下面的二维数组中查找数字7,则返回true,查找数字5,则返回false。解法具体思路:首先选取数组中右上角的元素,如果该元素等于要查找的元素,则查找过程结束。 如果该数字大于要查找的数字,则剔除这个数字所在的列。 如果该数字小于要查找的数字,则剔除该数字所在的行。 如此进行,直到查找到这个数字或者...原创 2019-03-29 01:13:26 · 149 阅读 · 0 评论 -
面试题18:删除链表的节点
题目该系列文章题目和思路均参考自:《剑指Offer》- Page 119解法在单向链表中删除一个节点,常规的做法是从链表的头结点开始,顺序遍历查找要删除的节点,然后修改该节点前一个节点的next指针,指向要删除节点的后一个节点。这样可以安全删除链表中要删除的节点。但这种思路需要知道待删除节点的前一个节点才能进行,而且时间复杂度为O(n)。如下图中的(a)和(b)所示。那...原创 2019-04-20 12:15:48 · 257 阅读 · 0 评论