剑指OFFER
weixin_45405128
stay hungry, stay foolish.
展开
-
剑指OFFER 26. 二叉搜索树与双向链表,python iteration, one-pass, O(n)
class Solution: def Convert(self, root): if not root: return stack=[] newhead=None while root or stack: if root: stack.append(root) root=root.left else:原创 2021-04-04 22:36:35 · 162 阅读 · 0 评论 -
剑指OFFER 面试题32(队列:先进先出):从上到下打印二叉树(JAVA)
题目1不分行从上到下打印二叉树。从上往下打印出二叉树的每个节点,同一层的节点从左到右的顺序打印。思路每次打印一个结点的时候,如果该节点有子节点,把该节点的子节点放到一个队列的末尾。接下来到队列的头部取出最早进入队列的节点,重复前面打印操作,直到队列中所有的节点都被打印出来。代码1import java.util.ArrayList;public class PrintTr...原创 2019-08-19 20:20:59 · 202 阅读 · 0 评论 -
剑指OFFER 面试题14(动态规划和贪婪算法): 剪绳子 (JAVA)
面试题14:剪绳子题目:给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n>1并且m≥1)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]*k[1]*…*k[m]可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。动态规划:用动态规划从上往下分析问题,从下往上解决问题。空间复杂度为O(n),时间复杂度为...原创 2019-08-10 15:52:38 · 254 阅读 · 0 评论 -
剑指OFFER 面试题15(二进制):二进制中1的个数 (JAVA)
题目 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。知识点(二进制的位运算)二进制的位运算只有五种运算(与、或、异或、左移和右移)。左移运算m<<n表示把m左移n位,在左移n位的时候,最左边n位将被丢弃,同时在最右边补上n个0,例如:00001010<<2 = 00...原创 2019-08-10 17:42:10 · 96 阅读 · 0 评论 -
剑指OFFER 面试题16(位运算):数值的整数次方(JAVA)
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。使用位运算来提高计算效率:如果指数是32,只要计算16次方的平方,16次方是8次方的平方...计算32次方仅需要做5次乘法。如果指数是奇数,例如33,则先求32次方(5次乘法),再乘以base,一共6次运算。代码...原创 2019-08-10 20:16:50 · 121 阅读 · 0 评论 -
剑指OFFER 面试题17(全排列递归):打印1到最大的n位数(JAVA)
题目输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。思路在遇到比长整型还大的数时,不能通过定义 long number来实现。这时需要考虑用字符串或者数组来表示大数。如果在所有的数字前面补0的话,就会发现n位所有的十进制数其实就是n个从0到9的全排列。也就是说,我们把数字的每一位都从0到9排列一遍,就得到了所有的十进制数。在打...原创 2019-08-11 11:59:24 · 186 阅读 · 0 评论 -
剑指OFFER 面试题18_1(链表):删除链表的节点(JAVA)
题目给定单链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点方法1:顺序遍历,O(n)从链表的头结点开始(为了不断链,需找到删除节点的前一个节点,将前一节点指向删除节点的下一节点,即可实现删除节点操作)。方法2:复制下一个节点到要删除的节点将下一节点的内容复制到要删除的节点上,覆盖原有的内容,再把下一个节点删除(将本来要删除的节点指向下下一个节点)。若要删除...原创 2019-08-11 15:13:16 · 134 阅读 · 0 评论 -
剑指OFFER 面试题19(递归):正则表达式匹配(JAVA)
题目请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"及"ab*a"均不匹配。思路当模式中的第二个字符是“*”时: 1. 如果字符串第一个字符跟模式第一个...原创 2019-08-11 18:29:09 · 183 阅读 · 0 评论 -
剑指OFFER 面试题23:链表中环的入口节点 (JAVA)
题目给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路第一步是:如何确定一个链表中包含环。定义两个指针,同时从链表的头节点出发,第一个指针一次走一步,第二个指针一次走两步。如果走得快得指针追上了走得慢的指针,那么链表就包含环;如果走得快得指针走到了链表得末尾都没有追上第一个指针,那么链表就不包含环。第二步是:如何找到环的入口、先定义两个指针P1和P2指向...原创 2019-08-16 09:03:20 · 128 阅读 · 0 评论 -
剑指OFFER 面试题24:反转链表 (JAVA)
题目定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。思路在图中所示的链表中,h, i, j是3个相邻的结点。假设经过若干的操作,我们已经把结点h之前的指针调整完毕,这些结点的next都指向前面的一个结点。接下来我们把i的next指向h,此时的链表结构如图b所示。为了避免链表在结点 i 处断开,我们需要在调整结点 i 的next之前把结点 j 保存下来。也...原创 2019-08-16 19:43:25 · 96 阅读 · 0 评论 -
剑指OFFER 面试题25:合并两个排序的链表 (JAVA)
题目输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。思路我们的分析从合并两个链表的头结点开始。链表1的头结点的值小于链表2的头结点的值,因此链表1的头结点将是合并后链表的头结点。在两个链表中剩下的结点依然是排序的,因此合并这两个链表的步骤和前面的步骤是一样的。我们还是比较两个头结点的值。因此可以用递归的方法。代码采用递归的方法public...原创 2019-08-16 22:29:12 · 141 阅读 · 0 评论 -
剑指OFFER 面试题20:表示数值的字符串(JAVA)
题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。思路数字可能的形式包括:A, A.B, .B, (A/A.B/.B)(e/E)(A)其中注意A前面可存在+/-。代码publi...原创 2019-08-13 11:02:02 · 143 阅读 · 0 评论 -
剑指OFFER 面试题26(二叉树):树的子结构 (JAVA)
题目输入两棵二叉树A和B,判断B是不是A的子结构。思路(1)在A中找到与B的根节点的值一样的节点R;(2)判断A中以R为根结点的子树是否包含和B一样的结构。代码注意,当比较double的数值是否相等时,不能用“==”,而用下面代码中的函数equal,通过两数之差的绝对值小于一个很小的树来实现。/*class BinaryTreeNode{ double val;...原创 2019-08-18 15:17:27 · 140 阅读 · 0 评论 -
Notes of CFA Level1 READING 11: SAMPLING AND ESTIMATION
MODULE 11.1: CENTRAL LIMIT THEOREM AND STANDARD ERRORsampling error of the mean = sample mean − population mean =.sampling distribution 抽样分布分层抽样 Stratified samplingtime-series and cross-sect...原创 2019-08-26 08:18:29 · 429 阅读 · 0 评论 -
剑指OFFER 面试题33(二叉搜索树):二叉搜索树的后序遍历序列(JAVA)
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。思路二叉搜索树后序遍历的特点:在后序遍历得到的序列中,最后一个数字是树的根节点的值。数组中前面的数字可以分为两部分:第一部分是左子树节点的值,它们都比根节点的值小;第二部分是右子树结点的值,它们都比根节点的值大。代码pu...原创 2019-09-10 16:49:16 · 153 阅读 · 0 评论 -
剑指OFFER 面试题31:栈的压入、弹出序列(JAVA)
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。思路解决这个问题很直观的想法就是建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依...原创 2019-08-19 15:58:42 · 130 阅读 · 0 评论 -
剑指OFFER 面试题30:包含Min函数的栈(JAVA)
题目定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素 min 函数。在栈中,调用 min、push、及 pop 的时间复杂度都是O(1)。思路我们可以使用两个栈,一个数据栈,另一个为辅助栈。辅助栈用于存放最小元素和每次压栈时的次小元素(之前的最小元素和新压入栈的元素两者之间的最小值或相等)。如果每次都把最小元素压入辅助栈,那么就能保证辅助栈顶一直都是最小元素。当最小元素从...原创 2019-08-19 15:05:29 · 120 阅读 · 0 评论 -
剑指OFFER 面试题22:链表中倒数第 K 个节点(JAVA)
题目输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。思路为了实现只遍历链表一次就能找到倒数第k个结点,我们可以定义两个指针。第一个指针从链表的头指针开始遍历向前走k-1。第二个指针保持不动;从第k步开始,第...原创 2019-08-14 13:52:18 · 121 阅读 · 0 评论 -
剑指OFFER 面试题7(二叉树):(前序/后序+中序)重建二叉树 (JAVA)
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},请重建二叉树并返回。思路:(1)首先根据根节点a将中序遍历划分为两部分,左边为左子树,右边为右子树(2) 在左子树和右子树分布根据上述规则递归,得出左、右边...原创 2019-07-30 20:02:54 · 429 阅读 · 0 评论 -
剑指OFFER 面试题6(链表):从尾到头打印链表 (JAVA)
方法1(栈):每经过一个节点,将该节点放到一个栈中。遍历完整个链表后,再从栈顶开始逐个输出节点的值。package codingquestions;import java.util.ArrayList;import java.util.Stack;class ListNode{ int val; ListNode next = null; ListNode(int val){...原创 2019-07-30 09:56:43 · 96 阅读 · 0 评论 -
剑指OFFER 面试题5(字符串):替换空格 (JAVA)
从后往前移动,每个字符仅移动一次,时间复杂度O(n)。package codingquestions;public class ReplaceBlank { public static String replacespaces(String str) { if (str==null || str.length() <=0) return null; int spac...原创 2019-07-29 20:49:45 · 145 阅读 · 0 评论 -
剑指OFFER 面试题3:数组中重复的数字 (JAVA)
方法1(利用数组的下标)package codingquestions;public class repeatednumbers { public static int duplication; public static boolean duplicate(int[] arr) { if (arr == null || arr.length == 0) { return ...原创 2019-07-26 13:17:11 · 113 阅读 · 0 评论 -
剑指OFFER 面试题4:二维数组中的查找 (JAVA)
方法1(二分法,逐行遍历查找)package codingquestions;public class Arraysearch { public static boolean find(int[][] array, int target) { for (int i=0; i<array.length;i++) { int low=0; int high=array...原创 2019-07-29 11:09:21 · 107 阅读 · 0 评论 -
剑指OFFER 面试题9(栈和队列):两个栈实现队列 (JAVA)
package codingquestions;import java.util.Stack;public class stackandqueue { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>()...原创 2019-07-31 13:33:53 · 110 阅读 · 0 评论 -
剑指OFFER 面试题10:Fibonacci Sequence (JAVA)
package codingquestions;public class Fibonacci { public static long fib(long n) { if (n<0) {throw new RuntimeException("please ensure n>=0");} if (n==0) {return 0;} if (n==1) {return 1...原创 2019-07-31 15:13:09 · 193 阅读 · 1 评论 -
剑指OFFER 面试题11:旋转数组中的最小数字 (JAVA)
遍历数组的时间复杂度是O(n)。考虑旋转数组的特性(可以将旋转后的数组分成两个子数组,前面的子数组的元素都大于后面子数组的元素,最小的元素刚好是这两个子数组的分界线),在排序的数组中可以用二分查找法实现O(logn)的查找。但是对于一些特例,例如{1,0,1,1,1}和{1,1,1,0,1} 第一个数字、最后一个数字和中间的数字都是1,难以确定中间的数字数以第一递增子数组还是第二递增子数组...原创 2019-08-01 09:49:45 · 181 阅读 · 0 评论 -
剑指OFFER 面试题12(回溯法):矩阵中的路径 (JAVA)
哇,这题好难!注意字符的标记,使用过的字符标记为1,未使用的字符标记为0。package codingquestions;public class StringPathInMatrix { public static boolean haspath(char[] matrix, int rows, int cols, char str[]) { char[][] mat =new ...原创 2019-08-06 14:46:42 · 131 阅读 · 0 评论 -
剑指OFFER 面试题21:调整数组顺序使奇数位于偶数前面(JAVA)
题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。思路可以维护两个指针,第一个指针初始化时指向数组的第一个数字,它只向后移动;第二个指针初始化时指向数组的最后一个数字,它指向前移动。在两个指针相遇之前,第一个指针总是位于第二个指针的前面。如果第一个指针的数字是偶数,并且第二个指针指向的数字是奇数,我们就交换两个数字。...原创 2019-08-13 19:49:21 · 93 阅读 · 0 评论 -
剑指OFFER 面试题27(二叉树):二叉树的镜像(JAVA)
题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。思路(1)交换根节点的左右子树(2)分别交换原左、右子树的根节点的左右子节点。代码(递归)public class MirrorofBinaryTree { public static void mirrortree(BinaryTreeNode root) { if(root==null) {return;}...原创 2019-08-18 20:01:11 · 85 阅读 · 0 评论 -
剑指OFFER 面试题28(二叉树):对称的二叉树 (JAVA)
题目请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。思路首先根节点以及其左右子树,左子树的左子树和右子树的右子树相同、左子树的右子树和右子树的左子树相同即可,采用递归。代码public class SymmetricalBinaryTree { public static boolean issymmetrical(Binary...原创 2019-08-18 20:41:16 · 107 阅读 · 0 评论 -
剑指OFFER 面试题29:顺时针打印矩阵(JAVA)
题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。思路把矩阵看成若干个顺时针方向的圈组成。假设这个矩阵的行数是rows,列数是columns。打印第一个圈是左上角元素的坐标是(0,0),第二圈的左上角的坐标是(1,1),依次类推。我们注意到,左上角的坐标中行标和列标总是相同的,于是可以在矩阵中选取左上角为(start,start)的一圈为我们分析的目标。对一...原创 2019-08-18 22:07:52 · 132 阅读 · 0 评论 -
剑指OFFER 面试题13(回溯法): 机器人的运动范围 (JAVA)
题目 地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。但它不能进入方格(35, 38),因为3+5+3+8=19。请问该机器人能够到达多少个格子?代码package codingquestion...原创 2019-08-09 16:03:36 · 164 阅读 · 0 评论 -
剑指OFFER 面试题8(二叉树):二叉树中的下一个节点 (JAVA)
题目:给定一颗二叉树和其中一个节点,如何找出中序遍历顺序的下一个节点?思路:(1)若当前节点有右子树时,其下一个节点为右子树中最左子节点;(2)若当前节点无右子树时, a. 若当前节点为其父节点的左节点时,其下一个节点是其父节点; b. 若当前节点为其父节点的右节点时,继续向上遍历父结点的父结点,直到找到一个结点是其父结点的左子结点,该结点即...原创 2019-07-30 22:07:32 · 125 阅读 · 0 评论