剑指Offer面试题-Java题解
本专栏记录了博主关于《剑指Offer》AC的题目以及踩的坑。
博客会对专栏中的代码保持更新和持续优化。
剑指Offer中的题目难度中等偏下,考察的都是编程基本功,并且书中内容质量比较高。同时由于代码篇幅较短,容易在面试中出现,所以还是有研究的必要。
Mi4o
这个作者很懒,什么都没留下…
展开
-
剑指Offer面试题:矩阵中的路径
矩阵中的路径题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abc...原创 2018-09-02 12:16:57 · 216 阅读 · 0 评论 -
剑指Offer面试题:序列化二叉树
序列化二叉树题目描述 请实现两个函数,分别用来序列化和反序列化二叉树分析序列化:将对象的信息/状态转换为可以存储的方式反序列化:将存储的信息转换为对象对本题来说就是将多维的二叉树转换为一维数组,以及提取一维数组信息还原二叉树的过程序列化很简单,对于空节点使用$符号代替,将树分为根节点、左子树、右子树递归遍历(前序)加入数组反序列化也是同样递归处理class TreeN...原创 2018-09-01 23:32:26 · 232 阅读 · 0 评论 -
剑指Offer面试题:字符串的排列
字符串的排列题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。分析只需要得到所有的字符串,然后对集合进行排序即可对于这种问题,可以先从abc的例子入手,从特殊解...原创 2018-09-01 22:54:41 · 258 阅读 · 0 评论 -
剑指Offer面试题:扑克牌顺子
扑克牌顺子题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为1...原创 2018-08-31 10:36:21 · 214 阅读 · 0 评论 -
剑指Offer面试题:和为S的连续正数序列
和为S的连续正数序列题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述: 输...原创 2018-08-31 00:12:54 · 230 阅读 · 0 评论 -
剑指Offer面试题:和为S的两个数字
和为S的两个数字题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。分析特别明显的算法是先固定一个数,然后对剩下的n-1个数进行遍历,查看是否满足条件,时间复杂度为O(n^2)这种算法的缺点在于没有利用数组已经排序的特点可以从数组的...原创 2018-08-30 23:16:05 · 196 阅读 · 0 评论 -
剑指Offer面试题:滑动窗口的最大值
滑动窗口的最大值题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,...原创 2018-08-30 15:30:41 · 301 阅读 · 0 评论 -
剑指Offer面试题:二叉树的深度
二叉树的深度题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。分析首先要理解什么是二叉树的深度最开始想到的是对二叉树进行前序遍历,得到最深的根节点,但是这样需要对比各个栈的深度,比较难处理然后对于树,最多的操作是递归操作:将二叉树深度定义为根节点+Max(左子树深度,右子树深度),递归处理即可...原创 2018-08-27 19:40:48 · 271 阅读 · 0 评论 -
剑指Offer面试题:翻转单词顺序列
翻转单词顺序列算法:首先将整个句子翻转一遍,然后对每个单词进行翻转需要考虑两种边界情况 输入字符串是空字符串输入的字符串只有一个单词,不需要进行翻转(这种情况更难处理):使用一个专门检查字符串是否为单个单词的函数即可 残留问题:本地能够通过对于输入字符串为”“和” “的输出,OJ上会出现对输入” “的异常java.lang.StringIndexOutOfBoundsExceptio...原创 2018-08-27 19:27:13 · 275 阅读 · 0 评论 -
剑指Offer面试题:数组中出现次数超过一半的数字
数组中出现次数超过一半的数字题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。分析### 解法1可以使用面向对象的思想,将数字和数字出现的次数封装,遍历一遍数组,同时每次遍历结果集这种方法思路简单,缺点就是时...原创 2018-08-26 19:35:47 · 447 阅读 · 0 评论 -
剑指Offer面试题:二叉搜索树的后序遍历序列
二叉搜索树的后序遍历序列题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。分析合法的二叉搜索树的后序遍历序列很多,所以首先默认序列是合法的然后只需要对于不合法的情况进行判定,同时涉及到二叉树的题型考虑使用递归解法 首先序列的最后一个元素一定是根节点然后可以将剩余部分分为左子树部分...原创 2018-08-25 09:46:20 · 173 阅读 · 0 评论 -
剑指Offer面试题:从上往下打印二叉树
从上往下打印二叉树题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。分析和平时接触到的二叉树的前中后序遍历不一样,画图遍历例子以后其实很简单实质过程就是有个容器(队列),将当前节点值拿出来,然后当前节点出队,如果当前节点有子节点,再将左右子节点入队即可import java.util.ArrayList;public class TreeNode {...原创 2018-08-24 21:31:42 · 176 阅读 · 0 评论 -
剑指Offer面试题:栈的压入、弹出序列
栈的压入、弹出序列题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)分析首先使用提供的两个例子可以找出规律 如果栈顶元素...原创 2018-08-23 11:04:37 · 171 阅读 · 0 评论 -
剑指Offer面试题:包含min函数的栈
包含min函数的栈题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。分析题目要求在给定的时间复杂度内完成对于最小元素的查找 但是并没有规定空间复杂度,也就是在暗示可以使用额外的存储空间对于O(1)的时间复杂度,可以考虑使用一个额外栈来保存对应时刻的最小值,两个栈具有同步性 这里需要注意假如栈顶是最小值时又弹出了元素...原创 2018-08-22 22:38:36 · 152 阅读 · 0 评论 -
剑指Offer面试题:顺时针打印矩阵
顺时针打印矩阵题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.分析这道题和前面做的 Z字形打印矩阵 CCF题一样,都是对于二维矩阵的自定义打印把矩阵的...原创 2018-08-21 18:01:29 · 165 阅读 · 0 评论 -
剑指Offer面试题:二叉树的镜像
二叉树的镜像题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ ...原创 2018-08-21 12:24:46 · 159 阅读 · 0 评论 -
剑指Offer面试题:合并两个排序的链表
合并两个排序的链表题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。分析 - 边界条件 - 两个链表中存在一个是空链表 - 两个链表都是空链表 - 两种边界条件可以合并处理 - 最开始考虑写循环,语句比较繁琐 - 即使从list1或者list2中选择了一个节点,剩下的问题没有发生变化 - 所以可以...原创 2018-08-20 00:41:29 · 150 阅读 · 0 评论 -
剑指Offer面试题:反转链表
反转链表题目描述 输入一个链表,反转链表后,输出新链表的表头。分析注意代码的鲁棒性,考虑链表的三种情况 链表为空链表只有一个元素,反转之后头节点不变链表有多个元素的一般情况使用三个指针记录pre now next:前驱节点、当前节点、后继节点,从左往右移动指针,直到链表末尾即可 特别要注意preNode和nowNode的赋值顺序,不然会造成死循环 packag...原创 2018-08-19 21:51:55 · 197 阅读 · 0 评论 -
剑指Offer面试题:链表中倒数第k个结点
链表中倒数第k个结点题目描述 输入一个链表,输出该链表中倒数第k个结点。 分析这是一道在面试中比较常见的问题可以首先遍历一遍链表得到长度n,然后遍历时取第n-k+1个节点就是目标节点,虽然时间复杂度为O(n),但是需要遍历两遍链表使用双指针的方式只用遍历一遍链表就能得到倒数第k个节点:首先让两个指针距离为k-1,这样第二个指针指向最后一个节点时,第一个指针指向的节点距离最后一个节...原创 2018-08-19 18:54:49 · 154 阅读 · 0 评论 -
剑指Offer面试题:数值的整数次方
数值的整数次方题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。分析题目本身没有难度,关键在于边界条件和效率优化 指数为负数时,涉及到除法,那么就涉及到除零判断0的非负整数次方都是0(其中0的0次方视作0)double类型不能直接使用==进行比较public class Solution { ...原创 2018-08-19 15:45:25 · 184 阅读 · 0 评论 -
剑指Offer面试题:进制中1的个数
二进制中1的个数题目描述 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 分析这道题最开始的想法是将十进制转为二进制数 ,然后二进制每移动一位判断是否为1,直到二进制数为0,但是这种情况下对于负数的转换很难处理。实质上考察的是二进制的位运算 对于二进制数n,n-1与n的与运算会消除n的最右边一位1这样有多少个1,循环就会执行多少次这种处理方式将正数、负数的情...原创 2018-08-19 14:30:10 · 166 阅读 · 0 评论 -
剑指Offer面试题:斐波那契数列 | 跳台阶 | 矩形覆盖
斐波那契数列题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39分析求解斐波那契数列是特别基础和常见的一道题,解法参考《剑指Offer》(1)递归求解效率不高,基本不会在实际中使用public class Solution { public int Fibonacci(in...原创 2018-08-19 11:28:31 · 240 阅读 · 0 评论 -
剑指Offer面试题:旋转数组的最小数字
旋转数组的最小数字题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。分析这道题显然需要对时间复杂度进行限制,不能直接使用一般的顺序查找,需要考虑到旋...原创 2018-08-19 11:08:44 · 231 阅读 · 0 评论 -
剑指Offe面试题:用两个栈实现队列
用两个栈实现队列题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。分析首先可以自己尝试使用1 2 3少量元素的入栈出栈摸索两个栈的使用,从特殊到一般最开始出栈的时候将栈1的元素弹出再次压进栈2,然后栈2此时最顶上的元素是最开始进来的元素,弹出即可对于一般情况下的出栈:如果栈2不为空,弹出栈2栈顶元素;如果栈2位空,将栈1所有的元素依次...原创 2018-08-18 17:08:01 · 308 阅读 · 0 评论 -
剑指Offer面试题:重建二叉树
重建二叉树题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。分析这是一道比较基础的二叉树问题前序遍历的第一个节点一定是根节点,首先得到根节点,然后利用根节点将中序遍历分为左子树部分+根节...原创 2018-08-18 16:03:59 · 159 阅读 · 0 评论 -
剑指Offer面试题:替换空格
替换空格题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。分析最开始使用Java解题,如果是建立新的字符串拷贝原有的字符串,时间复杂度只有O(n)public class Solution { public String replaceSpace(...原创 2018-08-18 11:22:12 · 184 阅读 · 0 评论 -
剑指Offer面试题:二维数组中的查找
二维数组中的查找题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分析 - 首先矩阵是有序的,所以实质上不需要遍历矩阵中所有的元素来判断是否含有目标整数。 - 然后观察到矩阵的右上角元素的性质:是每一行中的最大元素,也是每一列中的...原创 2018-08-18 10:46:46 · 213 阅读 · 0 评论