剑指offer
PPPeyton
下一站
展开
-
【剑指offer】面试题33:二叉搜索树的后序遍历序列
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历结果。 如果是则返回true,否则返回false。 假设输入的数组的任意两个数字互不相同。 例如: 输入数组{5, 7, 6, 9, 11, 10, 8},则返回true, 因为这个整数序列是下面这个二叉搜索树的后序遍历结果。 如果输入的数组是{7, 4, 6, 5},则由于没有 哪棵二叉搜索树的后序遍历结果是这个序列,因此返原创 2017-07-27 16:57:37 · 438 阅读 · 0 评论 -
【剑指offer】代码的完整性
从3个方面确保代码完整性1.功能测试合法的输入2.边界测试例如: 最大正数,最大负数,0等 循环或递归的边界条件 3.负面测试非法的输入3种错误处理方式1.函数用返回值来告知调用者是否出错这种方式最大的问题是使用不便,因为函数不能直接把计算结果通过返回值赋值给其他变量,同时也不能把这个函数计算的结果直接作为参数传递给其他函数。(不知道为什么这么说?有朋友解释一下吗?)2.当错误发生时设置 一个原创 2017-07-19 21:36:22 · 457 阅读 · 0 评论 -
【剑指offer】面试题16:数值的整数次方
题目给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路在代码注释里代码/** * 题目: * 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 * * 思路: * public double Power(double base, int exp) * 即 bas原创 2017-07-19 20:26:03 · 343 阅读 · 0 评论 -
【剑指offer】面试题15:二进制中1的个数
题目请实现一个函数,输入一个整数,输出该数二进制表示中1的个数,其中负数用补码表示。例如,把9表示成二进制是1001,有2位是1。因此,如果输入9,则该函数输出2。思路输入一个int型的整数,int是32位的 将这个数每次右移一位,与1做与操作 一共右移32次,即可得到答案代码public static int NumberOf1(int n) { int count = 0;原创 2017-07-19 20:15:58 · 532 阅读 · 0 评论 -
【剑指offer】面试题14:剪绳子
题目给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1,m>1), 每段绳子的长度记为 k[0], k[1], k[2], …, k[m]。 请问 k[0] * k[1] * k[2] * … * k[m] 可能的最大乘积是多少? 例如,当绳子的长度为8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 思路1.使用动态规划求解,当长度为n时,设最大乘积为f原创 2017-07-19 13:42:57 · 1146 阅读 · 0 评论 -
【剑指offer】面试题13:机器人的运动范围
题目地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?思路这道题跟面试题12:矩阵中的路径的思路是差不多的,原创 2017-07-19 11:07:48 · 408 阅读 · 0 评论 -
【剑指offer】面试题12:矩阵中的路径
题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如在下面的3*4矩阵 a b t g c f c s j d e h 矩阵中包含一条字符串”bfce”的路径,但是矩阵中不包含”abfb”路径,因为字符原创 2017-07-19 01:26:20 · 1034 阅读 · 0 评论 -
【剑指offer】面试题:变态跳台阶
题目一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路跳上1级台阶有1种跳法(1) 跳上2级台阶有2种跳法(1-1、2) 跳上3级台阶有4种跳法(1-1-1、1-2、2-1、3) 设跳上n级台阶有f(n)种跳法 f(n)种方法包括: 1. 跳上1级台阶后直接跳上n级台阶 2. 跳上2级台阶后直接跳上n级台阶 3. 跳上3级原创 2017-07-18 23:16:32 · 546 阅读 · 0 评论 -
【剑指offer】面试题:跳台阶
题目一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路很明显的求斐波那契数列类型的题目 当跳n级台阶的时候,设跳法有f(n)种 青蛙的第一步,可以跳1级,也可以跳2级(只有这两种选择) 1. 当跳1级的时候,剩下的有f(n-1)种 2. 当跳2级的时候,剩下的有f(n-2)种 so, f(0) = 0, f(1) = 1, f(2) = 2, f原创 2017-07-18 23:00:37 · 301 阅读 · 0 评论 -
【剑指offer】面试题11:旋转数组的最小数字
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路这道题目相对前面的比较复杂,坑比较多 此时用二分法解决,midIndex = array.length - 1原创 2017-07-18 22:39:23 · 402 阅读 · 0 评论 -
【剑指offer】面试题10:斐波那契数列
题目求斐波那契数列的第n项(n<=39) 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项 斐波那契数列的定义如下: ┌ 0 , n = 0 f(n)= ├ 1 , n = 1 └ f(n-1) + f(n-2) , n > 1 0,1,1,2,3,5,8,13… 思路不要用递归的方式,效率会出问题 解法:不断往上求解原创 2017-07-14 00:04:03 · 488 阅读 · 0 评论 -
【剑指offer】面试题9:用两个栈实现队列
题目用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路两个栈分别为stack1和stack2 stack1专门用来push stack2专门用来pop 当stack2执行pop操作时,检查stack2是否为空,为空的话则将执行操作:while(stack1.empty()) { stack2.push(stack1.pop());}代码Stack原创 2017-07-14 00:02:45 · 384 阅读 · 0 评论 -
【剑指offer】面试题8:二叉树的下一个节点
题目给定一棵二叉树和其中的一个节点, 如何找出中序遍历的下一个节点? 树中的节点除了有两个分别指向左、右节点的指针,还有一个指向父节点的指针。public static class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode paren原创 2017-07-13 19:50:01 · 608 阅读 · 0 评论 -
【剑指offer】面试题7:重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路前序遍历数组为pre[],中序遍历数组为in[] 1. pre[]中首个点为root,设值为value 2. 在in[]中寻找值为value的点 3.原创 2017-07-13 18:19:59 · 420 阅读 · 0 评论 -
【剑指offer】面试题6:从头到尾打印链表
题目输入一个链表,从尾到头打印链表每个节点的值。链表节点的定义如下:class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}思路方法1:放到LinkedList中再打印出来(一起入栈然后出栈) 方法2:遍历链表的时候将指针的指向反转(原创 2017-07-13 01:07:34 · 508 阅读 · 0 评论 -
【剑指offer】面试题5:替换空格
题目请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路方法1:用split进行分割,然后用StringBuilder再进行组合 这样做的话时间复杂度O(n),空间复杂度O(n) 方法2:先遍历字符串,统计出字符串中空格的总数。因为空格要换成%20,所以可以计算出替换后的字符串的总长度,新字原创 2017-07-13 00:45:50 · 391 阅读 · 0 评论 -
【剑指offer】面试题17:打印从1到最大的n位数
题目输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数999。思路例如输入数字3 可以当成排列如下数字: 000 001 002 … 997 998 999 即打印出数字的全排列。 所以可以递归求解 代码public static void Print1ToMaxOfNDigits_1(int n) { if(n <= 0原创 2017-07-19 23:04:23 · 520 阅读 · 1 评论 -
【剑指offer】面试题18:删除链表中重复的节点
题目在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路1.用tmpNode和current指向头结点,用一个flag标志遇到连续的重复值 2.current用来遍历整个链表,在遍历时,每当遇到一个新的值的节点,就用tmpNode指向整个节点 3.直到遇到下一个新的值前,c原创 2017-07-20 17:37:36 · 402 阅读 · 0 评论 -
【剑指offer】面试题22:链表中的倒数第k个节点
题目输入一个链表,输出该链表中倒数第k个节点。 为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。 例如,一个链表有6个节点,从头结点开始,它们的值以此是1、2、3、4、5、6。 这个链表的倒数第3个节点是值为4的节点。 思路定义两个节点node1,node2 让node1一开始指向第k个节点,node2指向第1个节点 此时node1和node2同时前进,[nod原创 2017-07-20 23:40:35 · 387 阅读 · 0 评论 -
【剑指offer】面试题32(3):之字形打印二叉树
题目请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路刚看到这个题目的时候,感觉很简单,还是用之前的做法,用队列来实现,然后用一个辅助栈,来对偶数行的进行压栈并出栈放到队列中。但是这个做法并不是最好的,代码实现起来较为复杂 更好的做法: 使用两个栈来解决这个问题。我们在打印某一层的节点时,把下一层的原创 2017-07-27 15:31:26 · 328 阅读 · 0 评论 -
【剑指offer】面试题32(2):分行从上到下打印二叉树
题目从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路用队列来保存要打印的节点。 同时我们需要两个变量:一个变量表示在当前层中还没有打印的节点数;另一个变量表示下一层节点的数目。代码public class _32_02_PrintTreesInLines { public static class TreeNode { public int val = 0原创 2017-07-27 01:52:16 · 914 阅读 · 0 评论 -
【剑指offer】面试题32(1):从上往下不分行打印二叉树
题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路很直观,用队列解决代码public class _32_01_PrintTreeFromTopToBottom { public static class TreeNode { public int val = 0; public TreeNode left = null; publi原创 2017-07-27 01:32:21 · 675 阅读 · 0 评论 -
【剑指offer】面试题31:栈的压入、弹出序列
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路这道题思路还是挺简单的 用一个辅助栈来解决,把压入序列的数字依次压入该辅助栈,并按照第二个原创 2017-07-26 23:04:21 · 408 阅读 · 0 评论 -
【剑指offer】面试题30:包含min函数的栈
题目定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。思路用一个值来保存最小值是行不通的,因为栈pop操作后,最小值就变了。 但是可以使用另外一个栈minStack来保存最小值。 每次push操作时,将当前最小值与新元素对比得出新的最小值,同时push进minStack。 每次pop操作时,两个栈同时pop。 代码public class _30_MinInStack {原创 2017-07-26 21:59:56 · 336 阅读 · 0 评论 -
【剑指offer】面试题29:顺时针打印矩阵
题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如,如果输入如下矩阵: 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. 思路 采用上图的方式进行遍历,每次遍历一个矩形需要四个循环。 按照 上->右->下->左 的方式原创 2017-07-26 21:31:56 · 387 阅读 · 0 评论 -
【剑指offer】面试题23:链表中环的入口节点
题目一个链表中包含环,请找出该链表的环的入口节点。思路先判断链表中是否包含环 (node1,node2指向头结点,node1每次向前移动1步,node2每次向前移动2步,若出现node1==node2,则有环,若node2==null,则无环)若链表中存在环,则统计环的节点个数count寻找环的入口节点 (node1,node2指向头结点,node1先向前移动count步,然后node1和原创 2017-07-23 23:02:25 · 575 阅读 · 0 评论 -
【剑指offer】面试题20:表示数值的字符串
题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。 解题时犯的错误我在提交的时候错了三次: 1.第一次挂:-.123应该输出true(错在不懂得有这种情况) 2.第二次挂:12e应该输出f原创 2017-07-23 01:55:19 · 749 阅读 · 1 评论 -
【剑指offer】面试题19:正则表达式匹配
题目请实现一个函数用来匹配包括’.’和’*’的正则表达式。模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配。思路代码测试原创 2017-07-22 14:49:27 · 628 阅读 · 0 评论 -
【剑指offer】面试题28:对称的二叉树
题目请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路看下面的代码注释代码/** * 题目: * 请实现一个函数,用来判断一颗二叉树是不是对称的。 * 注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。 * * 思路: * 从根节点的左右两个子节点出发 * 左子节点采用 根左右 的方式遍历 * 右子节点采用原创 2017-07-21 23:24:23 · 546 阅读 · 0 评论 -
【剑指offer】面试题27:二叉树的镜像
题目操作给定的二叉树,将其变换为源二叉树的镜像。思路求一棵树的镜像的过程:先前序遍历这棵树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有的左右子节点之后,就得到了树的镜像。代码/** * 操作给定的二叉树,将其变换为源二叉树的镜像。 * 二叉树的镜像定义: * 源二叉树: * 8 * / \ * 6 10原创 2017-07-21 20:22:41 · 436 阅读 · 0 评论 -
【剑指offer】面试题26:树的子结构
题目输入两棵二叉树A,B,判断B是不是A的子结构。 (ps:我们约定空树不是任意一个树的子结构) 思路找到树A中与树B根节点值相同的节点,设树A中该节点为subRoot在遍历树B的同时,遍历subRoot,如果遍历完树B发现subRoot中没有与B不一致的地方,则B是A的子结构遍历树B时,发现subRoot中有与树B结构不一致的地方,则退出遍历重复步骤1,找到树A中与树B根节点下一个值相原创 2017-07-21 17:26:11 · 346 阅读 · 0 评论 -
【剑指offer】面试题25:合并两个排序的链表
题目输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 例如: 链表1:1->3->5->7 链表2:2->4->6->8 合并后:1->2->3->4->5->6->7->8 思路太简单了,就不说了 主要还是考察代码的鲁棒性 考虑空指针的情况 代码public static class ListNode { public int val; p原创 2017-07-21 16:24:08 · 671 阅读 · 0 评论 -
【剑指offer】面试题21:调整数组顺序使奇数位于偶数前面
题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路在代码注释里面代码/** * 题目: * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序, * 使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分, * 并保证奇数和奇数,偶数和偶数之间的相原创 2017-07-20 23:39:15 · 354 阅读 · 0 评论 -
【剑指offer】面试题24:反转链表
题目定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点思路很简单,单纯考察代码的鲁棒性 要针对区分成以下三种情况处理: 1.输入的链表头指针为null 2.输入的链表只有一个节点 3.输入的链表有多个节点(正常情况)代码public static class ListNode { public int val; public ListNode next =原创 2017-07-21 16:02:05 · 344 阅读 · 0 评论 -
【剑指offer】面试题4:二维数组的查找
题目在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路代码public static boolean Find(int target, int[][] array) { // 不做这个判断的话,在y=array[0].length-1时会抛出异常 if(array.原创 2017-07-13 00:17:46 · 524 阅读 · 0 评论 -
【剑指offer】面试题39:数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路解法1 最直观的解法,用哈希表来做,数字映射出现的次数 时间复杂度O(n),空间复杂度O(n),数组不会乱序解法2 也是很直观的解法,将数组排序后,遍历查看是否有符合条件的数原创 2017-07-29 03:18:20 · 462 阅读 · 0 评论 -
【剑指offer】面试题:求字符串的所有组合
题目输入一个字符串,打印出该字符串中字符的所有组合。 例如输入三个字符a, b, c,则它们的组合有 a, b, c, ab, ac, bc, abc。 当交换字符串中的字符时,虽然能得到两个不同的排列,但却是同一个组合。比如 ab 和 ba 是不同的排列,但只算一个组合。思路如果输入n个字符,则这n个字符能构成长度为1, 2, …, n的组合。 求n个字符的长度为m(1≤m≤n)的组合的时候原创 2017-07-29 00:55:47 · 1897 阅读 · 0 评论 -
【剑指offer】面试题57(2):和为S的连续正数序列
题目小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。 但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。 没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。 现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! ps: 输出所有和为S的连续正数序列。原创 2017-08-03 20:35:02 · 386 阅读 · 0 评论 -
【剑指offer】面试题57(1):和为S的数字
题目输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 ps: 对应每个测试案例,输出两个数,小的先输出。 思路看代码前的注释代码/** * 题目: * 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, * 如果有多对数字的和等于S,输出两个数的乘积最小的。 * 对应每个测试案例原创 2017-08-03 19:56:14 · 492 阅读 · 0 评论 -
【剑指offer】面试题56(1):数组中只出现一次的两个数字
题目一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路有空再补上 0.0代码/** * 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 * * @author peige */public class _56_01_NumbersAppearOnce { /** * num1,nu原创 2017-08-02 01:24:11 · 381 阅读 · 0 评论