剑指Offer-Java
浊酒入清梦
作者很勤快,但是什么也没有留下...
展开
-
剑指Offer-题3(Java版):找出数组中重复的数字
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:找出数组中重复的数字 在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了, 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。主要思路:数组中的数字范围为0~...原创 2018-04-21 19:04:09 · 260 阅读 · 1 评论 -
剑指Offer-题4(Java版):有序二维数组中的查找
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:有序二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。主要思路:首先选取数组右上角的数字作为第一个查找元素。如果该元素等于要查找的数字,则查找结束;若该元素小于要查找的数字,则在下面的行中查找;若...原创 2018-04-23 10:59:12 · 168 阅读 · 0 评论 -
剑指Offer-题5(Java版):替换字符串中的空格
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:替换字符串中的空格 请实现一个函数,把字符串中的每个空格替换成”%20”。 例如输入“We are happy.”,则输出“We%20are%20happy.”。主要思路:1.首先计算出字符串中的空格数目,进而获取新字符串的长度(原始长度+空格数目*2)。2.从字符串后面开始向前遍历,若遇到空格,则把空格替换成”%20”,否则...原创 2018-04-23 11:26:29 · 197 阅读 · 0 评论 -
剑指Offer-题6(Java版):从尾到头打印链表
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:从尾到头打印链表 输入一个链表的头结点,从尾到头反过来打印出每个结点的值。主要思路:借助栈的后进先出特点,从头到尾添加数值到栈中,然后从栈中取出元素。另外也可以借助递归,递归实质上用到方法栈,但递归可能会导致方法栈溢出。关键点:后进先出,递归时间复杂度:O(链表长度)public class ListFromTail...原创 2018-04-23 19:42:40 · 117 阅读 · 0 评论 -
剑指Offer-题7(Java版):重建二叉树
参考自:《剑指Offer——名企面试官精讲典型编程题》 以及博客:https://www.cnblogs.com/edisonchou/p/4741099.html题目:重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2...原创 2018-04-24 18:40:40 · 137 阅读 · 0 评论 -
剑指Offer-题8(Java版):在中序遍历中,求二叉树的下一个节点
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:在中序遍历中,求二叉树的下一个节点 给定一棵二叉树和其中的一个节点,如何找出中序遍历顺序的下一个节点?树中的结点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针。主要思路: 分三种情况: 1.该节点的右子树非空:它的下一节点就是右子树的最左节点。 2.该节点的右子树为空,但是它是其父节点的左节点:下一节点就...原创 2018-04-24 19:20:43 · 349 阅读 · 0 评论 -
剑指Offer-题9(Java版):用两个栈实现队列
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:用两个栈实现队列 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。主要思路:结合栈先进后出和队列先进先出的特点。先把元素压入第一个栈,再把元素弹出到第二个栈,使得最开始插入的元素在第二个栈的顶部。在第一个栈上执行插入操作;在...原创 2018-04-25 10:18:47 · 197 阅读 · 0 评论 -
剑指Offer-题10(Java版):斐波那契数列
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:斐波那契数列 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。主要思路: 方法1. f(0) = 0 f(1) = 1 f(n) =f(n-1)+f(n-2) n>1 计算过程要避免重复计算,因此需要保存之前的计算结果。方法2. 通项公式 关键点:避免重复计算,递归时间复...原创 2018-04-25 10:45:10 · 179 阅读 · 0 评论 -
剑指Offer-题11(Java版):旋转数组的最小数字
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组 {3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。主要思路:旋转后的数组分成两个排序的子数组,前面的子数组都大于或等于后面的子数组,...原创 2018-04-26 21:26:45 · 174 阅读 · 0 评论 -
剑指Offer-题12(Java版):矩阵中的路径
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:矩阵中的路径 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入 该格子。例如在下面的3×4的矩阵中包含一条字符串“BFCE”的路径(路径中的字母用下划线标出)。但矩阵中不包含字符...原创 2018-04-26 22:17:31 · 234 阅读 · 2 评论 -
剑指Offer-题13(Java版):机器人的运动范围
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:机器人的运动范围 地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格(35, 37),因为3+5+3+7=18。但它不能进入方格(35, 38),因为3+5+3+8=19。请问该机器人能够到...原创 2018-04-27 21:42:41 · 558 阅读 · 0 评论 -
剑指Offer-题14(Java版):剪绳子
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:剪绳子 给你一根长度为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。主要思路: 思路一:动态规划:f(n) = m...原创 2018-04-30 22:04:21 · 313 阅读 · 0 评论 -
剑指Offer-题15(Java版):二进制中1的个数
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:二进制中1的个数 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如:把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。主要思路:把一个整数减去1,都是把最右边的1变为0。如果它的右边还有0,则其右边所有的0变为1,其左边的所有位保持不变。因此,把一个整数和它减去1的结果做位与运算,相当于把它最...原创 2018-05-01 19:12:16 · 128 阅读 · 0 评论 -
剑指Offer-题16(Java版):数值的整数次方
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:数值的整数次方 实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。主要思路: 以下以n代替exponent(指数) n为偶数: an=an/2×an/2an=an/2×an/2a^n = a^{n/2}×a^{...原创 2018-05-01 19:45:19 · 100 阅读 · 0 评论 -
剑指Offer-题17(Java版):打印1到最大的n位数
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:打印1到最大的n位数 输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。主要思路:1到最大的n位数其实就是n个从0到9的全排列,把数字的每一位从0到9排列一遍就得到所有的数,总数目为10n10n10^n。可以使用递归实现全排列。关键点:递归时间复杂度:O(10n1...原创 2018-05-02 18:16:22 · 183 阅读 · 0 评论 -
剑指Offer-题18(Java版):在O(1)时间删除链表结点
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:在O(1)时间删除链表结点 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。主要思路: 分三种情况: 1.要删除的结点不是尾结点:将要删除的结点替换成它的下一个结点。 2.链表只有一个结点,即头结点就是要删除的结点:直接将头结点设置为null。 3.要删除的结点是尾结点:找到要删除的结点的前一个...原创 2018-05-02 18:40:42 · 127 阅读 · 0 评论 -
剑指Offer-题19(Java版):正则表达式匹配
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:正则表达式匹配 请实现一个函数用来匹配包含’.’和’*’的正则表达式。模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但与”aa.a”及”ab*a”均不匹配。主要思路: 分四种情...原创 2018-05-03 19:04:19 · 266 阅读 · 0 评论 -
剑指Offer-题20(Java版):表示数值的字符串
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:表示数值的字符串 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。主要思路:表示数值的字符串遵循模式A[.[B]][e|E(C)]或者...原创 2018-05-03 19:31:59 · 226 阅读 · 0 评论 -
剑指Offer-题21(Java版):调整数组顺序使奇数位于偶数前面
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。主要思路:扫描数组,若发现偶数在奇数前面,则交换它们的位置。使用两个指针,第一个指针从数组第一个元素开始向后扫描,第二个指针从数组最后一个元素开始向前扫描。若第一个指针指向偶数,第二...原创 2018-05-04 18:39:01 · 226 阅读 · 0 评论 -
剑指Offer-题22(Java版):链表中倒数第k个结点
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:链表中倒数第k个结点 输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。主要思路:使用双指针,前面的指针先走k-1步,后面的指针再从头结点开始移动,当...原创 2018-05-04 19:05:45 · 96 阅读 · 0 评论 -
剑指Offer-题23(Java版):链表中环的入口结点
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:链表中环的入口结点 若一个链表中包含环,如何找出环的入口结点?主要思路: 第一步:判断链表是否有环。使用双指针,一个指针(慢指针)一次走一步,另一个指针(快指针)一次走两步。如果快指针追得上慢指针,说明有环,否则链表无环。 第二步:求环的长度L。第一步中的快慢指针相遇的结点一定在环中(因为只有快慢指针在环中绕圈时,才能相遇)...原创 2018-05-05 20:04:34 · 132 阅读 · 0 评论 -
剑指Offer-题24(Java版):反转链表
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:反转链表 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。主要思路:为了反转链表,需要调整链表中每个结点的下一个结点为它的前一个结点。因此,需要3个指针,一个指向前个结点,一个指向当前结点,一个指向下个结点。反转过程:先保存当前结点的下个节点,然后将当前结点的next改为它的前个结点,最后更新指针状态,将...原创 2018-05-05 20:38:12 · 268 阅读 · 0 评论 -
剑指Offer-题25(Java版):合并两个排序的链表
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:合并两个排序的链表 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。主要思路:比较两个链表的当前结点,找出值较小的结点,将该结点添加到新链表的尾部。该过程可通过递归实现,其中要注意链表为空的情况。关键点:递归时间复杂度:O(n),n为两个链表的长度之和public class Merge...原创 2018-05-06 18:29:50 · 156 阅读 · 0 评论 -
剑指Offer-题26(Java版):树的子结构
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:树的子结构 输入两棵二叉树A和B,判断B是不是A的子结构。 例如: A:// 10// / \// 6 14// /\ /\// 4 8 12 16B:// 6/...原创 2018-05-06 18:54:52 · 141 阅读 · 0 评论 -
剑指Offer-题27(Java版):二叉树的镜像
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:二叉树的镜像 请完成一个函数,输入一个二叉树,该函数输出它的镜像(左右子节点交换)。 例如:// 10// / \// 6 14// /\ /\// 4 8 12 16镜像为:// ...原创 2018-05-07 18:22:11 · 138 阅读 · 0 评论 -
剑指Offer-题28(Java版):对称的二叉树
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:对称的二叉树 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 例如: 对称二叉树:以根节点做一条垂线,左右子节点关于该垂线对称// 10// / \// 6 6// /\ ...原创 2018-05-07 18:46:26 · 285 阅读 · 0 评论 -
剑指Offer-题29(Java版):顺时针打印矩阵
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。主要思路: 分4步: 第一步:从左到右打印一行; 第二步:从上到下打印一列; 第三步:从右到左打印一行; 第四步:从下到上打印一列; 其中,每一步根据起始和终止坐标打印。每一步的前提条件: 第一步:必需的; 第二步:至少两行,即终止...原创 2018-05-08 18:42:44 · 149 阅读 · 0 评论 -
剑指Offer-题30(Java版):包含min函数的栈
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。主要思路:使用两个栈,一个主栈,一个最小栈(记录当前最小值)。每次把元素压入主栈时,若该元素小于等于最小栈的栈顶元素,则同时把该元素压入最小栈。当把主栈元素弹出时,若该元素等...原创 2018-05-08 19:00:26 · 149 阅读 · 0 评论 -
剑指Offer-题31(Java版):栈的压入与弹出序列
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:栈的压入与弹出序列 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。 例如:序列{1、2、3、4、5}是某栈的压栈序列,序列{4、5、3、2、1}是该压栈序列对应的一个弹出序列。但{4、3、5、1、2}就不可能是该压栈序列的弹出序列。主要思路:借助辅助栈,并且使...原创 2018-05-09 19:28:18 · 119 阅读 · 0 评论 -
剑指Offer-题32(一)(Java版):不分行从上往下打印二叉树
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:不分行从上往下打印二叉树 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。主要思路:相当于广度优先遍历二叉树。因此借助一个队列来实现,每次打印完父节点,都把它的左节点和右节点添加到队列。关键点:广度优先遍历时间复杂度:O(n)public class PrintTreeTopToBottom{...原创 2018-05-09 19:37:51 · 141 阅读 · 0 评论 -
剑指Offer-题32(二)(Java版):分层从上往下打印二叉树
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:分层从上往下打印二叉树 从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。主要思路:相当于广度优先遍历二叉树。因此借助一个队列来实现,每次打印完父节点,都把它的左节点和右节点添加到队列。同时,使用一个变量来记录当前层中还未打印的节点数,另外一个变量用于记录下一层节点的数目。关键点:广度优先遍历,记录...原创 2018-05-10 20:32:21 · 284 阅读 · 0 评论 -
剑指Offer-题33(Java版):二叉搜索树的后序遍历序列
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。主要思路:后序遍历序列中最后一个数字即为根节点的值。序列前面数字可以分为两部分:第一部分是左子树节点的值,它们都比根节点的值小;第二部分是右子树节点的值,它们...原创 2018-05-10 20:59:06 · 156 阅读 · 0 评论 -
剑指Offer-题34(Java版):二叉树中路径和为某一值
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:二叉树中路径和为某一值 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。主要思路:用前序遍历节点,若当前节点是叶子结点,且路径结点值的和等于所求值,则当前路径符合要求;若当前节点不是叶子结点,则继续遍历它的左右子节点。当前节点及其子节点遍历完后,要...原创 2018-05-11 21:32:55 · 108 阅读 · 0 评论 -
剑指Offer-题35(Java版):复杂链表的复制
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:复杂链表的复制 请实现复制一个复杂链表的函数。在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个额外指针random指向链表中的任意结点或者null。主要思路: 分三步: 第一步:复制每个旧节点,使得新节点A’在旧节点A后面(A ->A’ ->B)。 第二步:根据旧节点的额外节点,设置新节点...原创 2018-05-11 22:16:08 · 164 阅读 · 0 评论 -
剑指Offer-题36(Java版):二叉搜索树与双向链表
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。主要思路:在二叉搜索树中,左子节点的值小于父节点的值,右子节点的值大于父节点的值。因此,将二叉搜索树转换成一个排序双向链表时,左子节点相当于双向链表中的前一个节点,右子节点相当于双向链表中的后一...原创 2018-05-12 21:30:13 · 230 阅读 · 0 评论 -
剑指Offer-题37(Java版):序列化与反序列化二叉树
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:序列化与反序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。主要思路: 序列化:用前序遍历序列化二叉树,保存当前节点值到字符串中,并添加”,”用于分割字符串。若当前节点为空,则使用一个特殊符号(比如”%”)来代替空节点。反序列化:先分割字符串,保存节点值到数组中。按前序遍历特点,先获取根节点,再获取左子树,最后...原创 2018-05-12 21:53:09 · 234 阅读 · 0 评论 -
剑指Offer-题38(Java版):字符串的排列
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。主要思路:把字符串看成两部分,第一部分是它的第一个字符,第二部分是后面的字符。第一步,求所有可能出现在第一个位置的字符,即把首字符逐个与后面的字符交换...原创 2018-05-13 18:06:16 · 229 阅读 · 0 评论 -
剑指Offer-题39(Java版):数组中出现次数超过一半的数字
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。主要思路:数字出现的次数超过数组长度的一半,说明它出现的次数比其他所有数字出现的次数和还要多。...原创 2018-05-13 19:04:19 · 147 阅读 · 1 评论 -
剑指Offer-题40(Java版):最小的k个数
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:最小的k个数 输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。主要思路:使用最大堆,保存目前已知的最小的k个数,堆顶是k个数中最大的元素。遍历数组,若堆中元素个数小于k,则直接添加到当前数字到堆中;若当前数字小于堆顶元素(即堆中最大元素),说明堆顶元素不可能...原创 2018-05-14 18:26:06 · 280 阅读 · 0 评论 -
剑指Offer-题41(Java版):数据流中的中位数
参考自:《剑指Offer——名企面试官精讲典型编程题》题目:数据流中的中位数 获取数据流中的中位数。如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。主要思路:可以把输入数据平分成两部分,左边的数据都小于右边的数据,那么即使左右两边内部的数据没有排序,也可以根据左边最大的数和右边最小...原创 2018-05-14 19:02:34 · 192 阅读 · 0 评论