剑指offer
学习
whtli
这个作者很懒,什么都没留下…
展开
-
【剑指offer】面试题33-二叉搜索树的后序遍历序列
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。样例1input:7,4,6,5outpu:false样例2input:2,4,3,6,8,7,5output:true解题思路二叉搜索树的特点,左子树中结点的值小于根结点的值,右子树中结点的值大于根结点的值。思路1 递归后序遍历...原创 2020-03-03 17:30:24 · 166 阅读 · 0 评论 -
【剑指offer】面试题29-顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.1.思路参考官方思路来的,复述一下官方思路:1.观察每一圈左上角元素的下标,其横纵坐标是相同的,设为(sta...原创 2020-02-16 13:18:48 · 131 阅读 · 0 评论 -
【剑指offer】面试题32-从上到下打印二叉树
题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。1. 思路二叉树的广度优先遍历(BFS),借助队列实现,遍历得到的结点元素值存储在列表里。2.代码(Java实现)import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;public class Solution { p...原创 2020-02-15 20:05:37 · 105 阅读 · 0 评论 -
【剑指offer】面试题31-栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列6,7,8,9,10是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但9,10,8,6,7就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)1.思路思路1 :根据出栈顺序的特点循环判断 – > O(n²)1.创...原创 2020-02-14 17:33:36 · 162 阅读 · 0 评论 -
【剑指offer】面试题27-二叉树的镜像
题目操作给定的二叉树,将其变换为源二叉树的镜像。1.思路(1)借助队列,完成二叉树的层次遍历;(2)在遍历过程中,每遇到一个节点,就将它的左右子树的根结点入队,然后进行互换;(3)这样就能保证每一个结点的左右子树都被镜像了一次,当遍历结束时,整个二叉树就被镜像了。2.代码(Java实现)import java.util.LinkedList;import java.util.Que...原创 2020-02-12 16:44:01 · 120 阅读 · 0 评论 -
【剑指offer】面试题26-树的子结构
题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)1.思路最开始用自己的思路,没有做对。我的思路是分别对两个树进行先/中/后序遍历,并将结点的值追加到字符串里,最后判断字符串1是否包含字符串2,包含就是子树,反之则不是。后来想了想,可能会出现并不是子树,但是先序遍历后其字符串顺序的确是会出现子串关系的情况。还是太菜了。。。剑指offer的思...原创 2020-02-11 21:52:30 · 143 阅读 · 2 评论 -
【剑指offer】面试题25-合并两个排序的链表
题目输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。1.思路(1)创建一个新链表newlist,尾插法不断将原来的两个链表的结点拼接到其尾部。(2)当两个链表均不空,同时遍历两个链表,进行元素大小判断,摘下元素值较小的结点尾插到newlist,同时指针后移继续比较。(3)循环跳出的时候有三种情况①两个链表都到头了,不需要继续处理;②list...原创 2020-02-10 12:16:09 · 127 阅读 · 0 评论 -
【剑指offer】面试题24-反转链表
题目输入一个链表,反转链表后,输出新链表的表头。1.思路思路1遍历链表,将链表的结点逐个摘下,用尾插法拼接到新的空链表尾部。思路2遍历两次链表:第一次遍历链表,找到链表的最后一个结点lastnode;第二次遍历链表,把链表的结点逐个用头插法拼接到lastnode之后。2.代码(Java实现)解题代码在第三部分,三部分组成完整的代码。public class Main { ...原创 2020-02-09 15:58:17 · 106 阅读 · 0 评论 -
【剑指offer】面试题22-链表中倒数第k个节点
题目输入一个链表,输出该链表中倒数第k个结点。1. 思路第一次遍历链表,计算链表长度length;第二次遍历链表,让指针向后移动length - k次,就可以得到倒数第k个结点。2.代码(Java实现/* 链表结点的数据结构public class ListNode { int val; ListNode next = null; ListNode(int v...原创 2020-02-08 20:31:54 · 101 阅读 · 1 评论 -
【剑指offer】面试题21-调整数组顺序使奇数位于偶数前面
题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。1.思路思路1: 插入排序 ---- 时间O(n²),空间O(1)双重循环,遇到偶数在前奇数在后的相邻两个元素就马上进行交换;这样能保证交换后奇数与奇数之间、偶数与偶数之间相对前后位置不变,即保证排序的稳定性。...原创 2020-02-07 23:22:12 · 154 阅读 · 0 评论 -
【剑指offer】面试题16-数值的整数次方
题目给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0。1 思路思路1:借助Java的函数 Math.pow(base, exponent),直接可以返回结果思路2:(1)手动实现求整数次方,借助循环,累乘,得到积result;(2)判断指数的正负,若是正数则result就是最终结果,...原创 2020-02-04 12:24:01 · 95 阅读 · 0 评论 -
【剑指offer】面试题15-二进制中1的个数
题目输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。1.思路1.借助Java的Integer.toBinaryString()函数,将十进制数转成二进制字符串str;2.for循环,循环str.length()次,遇到字符1(用单引号不是双引号哦)时,计数器就加一;3.返回计数器sum2.代码(Java)public class Solution { public ...原创 2020-02-03 22:30:17 · 120 阅读 · 0 评论 -
【剑指offer】面试题10(4)-矩形覆盖
题目我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?1.思路宏观分析依然是斐波那契数量问题的变形题。先把2 * n 的覆盖方法记作F(n)。用第一个2×1的小矩形去覆盖大矩形的左上角时,有两种选择:横着或者竖着。竖着放的时候,其右侧还剩2 × (n - 1)大小的区域,这种状态下的覆盖方法记作F(n - 1),若...原创 2020-02-02 22:15:48 · 176 阅读 · 0 评论 -
【剑指offer】面试题10(3)-变态跳台阶
题目一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。1.思路其实刚开始没太读懂题,看了下牛客网上大佬们的解答,原来就是求2的n次方的问题。2.代码(Java实现)// 简单粗暴,用移位的方法求n次方。public class Solution { public int JumpFloorII(int target) ...原创 2020-01-30 21:06:59 · 118 阅读 · 0 评论 -
【剑指offer】面试题10(2)-跳台阶
题目一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。1.思路这个题是斐波那契数列问题的变形。思路(1)用【剑指offer】面试题10(1)-斐波那契数列中解答斐波那契数列问题的思路即可:创建并初始化两个变量FibonacciFirst = F(0)和FibonacciSecond = F(1),在求解过程中不断更新F...原创 2020-01-29 22:02:42 · 198 阅读 · 0 评论 -
【剑指offer】面试题10(1)-斐波那契数列
题目大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。1.思路接触过编程语言的,在学递归的时候应该都是第一个就学斐波那契数列吧哈哈,就像程序员的第一句话永远是Hello World!来自官方的斐波那契数列定义复制用一下:斐波那契数列以如下被以递推的方法定义,F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n...原创 2020-01-25 23:18:17 · 328 阅读 · 0 评论 -
【剑指offer】面试题11-旋转数组的最小数字
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。1.思路逆序遍历数组,当找到相邻两个元素,满足前一个元素大于后一个元素时,返回后一个元素。很明显旋转数组的特点...原创 2020-01-23 22:58:48 · 144 阅读 · 0 评论 -
【剑指offer】面试题08-二叉树的下一个节点
题目给定一个二叉树和其中的一个节点,请找出中序遍历顺序的下一个节点并且返回。注意,树中的节点不仅包含左右子节点,同时包含指向父节点的指针。1.思路def:指定节点为pNode;中序遍历顺序的下一个节点为res(1)如果pNode有右子树,那么res一定存在于是pNode的右子树中按照中序遍历的规律,①如果pNode的右子树有左子树,那么res一定存在于是pNode的右子树的左子树的逻辑...原创 2020-01-22 21:35:45 · 340 阅读 · 0 评论 -
【剑指offer】面试题66-构建乘积数组
题目给定一个数组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]。不能使用除法。1. 思路思路1 两层循环—>O(n²)(1)对数组B的所有元素赋初值为1,借助Arrays.fill(B, 1)即可实现,数组定义之后元素默认值为0,不初始化为1的话就白给了(2)双重循环解决问题,仅...原创 2020-01-21 22:03:41 · 195 阅读 · 0 评论 -
【剑指offer】面试题9-用两个栈实现队列
题目用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。1.思路(1)stack1只用来负责push()操作,只要push()就对stack1进行入栈操作,即queue.push – 对应-- stack1.push();(2)stack1和stack2协同完成pop()操作,queue.pop()时会有两种情况:①stack2非空,此时直接对stack...原创 2020-01-20 20:43:09 · 163 阅读 · 0 评论 -
【剑指offer】面试题7-重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。1. 思路(1)确定根(2)左右递归建树为了方便递归传参,代码中使用了//arraycopy()方法初始化每次用于构建新子树的两个数组。arrayc...原创 2020-01-19 22:43:39 · 175 阅读 · 0 评论 -
【剑指offer】面试题6-从头到尾打印链表
题目输入一个链表,按链表从尾到头的顺序返回一个ArrayList。1.思路解法1:遍历单链表,头插法逆置链表。解法2:借助栈。解法3:递归。2.代码(Java实现)结点类定义/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int...原创 2020-01-18 23:58:27 · 162 阅读 · 0 评论 -
【剑指offer】面试题3-数组中的重复数字
题目在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。1.思路(1)新建一个数组index,遍历原数组numbers,用numbers[i]作为下标访问数组index,并将ind...原创 2020-01-17 22:24:44 · 207 阅读 · 0 评论 -
【剑指offer】面试题5-替换空格
题目请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。1. 思路**(1)**遍历StringBuffer,找到每一个空格;**(2)**用StringBuffer类的replace(int start, int end, String str)方法使用给定的字符串“%20”替换此...原创 2020-01-17 21:41:03 · 121 阅读 · 0 评论 -
【剑指offer】面试题4-二维数组中的查找
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。1.思路获取数组的长和宽,以二维数组右上角或者左下角元素作为标志位进行遍历(这里以右上角举例)。①若右上角元素值与目标值target相等,返回true;②若右上角元素值大于(>)目标值t...原创 2020-01-16 22:34:26 · 147 阅读 · 0 评论