![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer java版
小小核桃
这个作者很懒,什么都没留下…
展开
-
【Java】面试题68:树中两个节点的最低公共祖先
情景一:假设该树是一棵二叉搜索树:我们只需从根结点判断,如果二结点与根的左右子树比较一大一小,那么跟结点就是二者最低公共祖先;如果二结点都比左子结点小,向左子树递归进行比较;如果二结点都比右子树结点大,向右子树递归进行比较; public static TreeNode getLastCommonNode(TreeNode pRoot,TreeNode pLeft, TreeNode ...转载 2019-04-13 21:37:20 · 568 阅读 · 1 评论 -
【Java】面试题42:连续子数组的最大和
题目描述:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。分析思路: Step1.从头到尾逐个累加数组中的每个数字,初始化和为0;(nCurrSum=0,nGreatestN...转载 2019-03-28 09:22:52 · 279 阅读 · 0 评论 -
【Java】面试题50:第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出’b’。第一思路:借助于数组来做。开辟一个长度为26的数组,用来存放字符串中每个字符出现的次数。这样第一次扫描去统计这个字符串中字符出现的次数,第二次去统计第一个出现结果为1的次数,并输出对应的字符。package jianZhiOffer;import java.util.HashMap;import ...转载 2019-04-01 09:39:53 · 239 阅读 · 0 评论 -
【Java】面试题41:数据流中的中位数
题目描述:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。分析思路:用两个堆保存数据,保证两个堆的数据保持平衡(元素个数相差不超过1)大顶堆存放的数据要比小顶堆的数据小当两个堆中元素为偶数个,将新加入元素加入到大顶堆,如果要加入的数据,比小顶堆的最小元素大...转载 2019-03-27 14:57:46 · 148 阅读 · 0 评论 -
【Java】面试题40:最小的k个数
题目:输入n个整数,找出其中最小的k个数。例如输入4、 5、 1、 6、 2、 7、 3、 8这8个数字,则最小的4个数字是1、 2、 3、 4。思路:O(n)的算法,只有当我们可以修改输入的数组是可用经典常用的算法,快速排序的精髓利用快速排序划分的思想,每一次划分就会有一个数字位于以数组从小到达排列的的最终位置index;位于index左边的数字都小于index对应的值,右边都大于inde...转载 2019-03-27 11:20:43 · 139 阅读 · 0 评论 -
【Java】面试题49:丑数
题目:丑数我们把只包含因子2,3,5的数称为丑数(Ugly Number).求按从小到大的顺序的第1500个丑数。例如6,8都是丑数,但14不是,因为它含有因子7.习惯上我们把1当作第一个丑数方法一:逐个判断每个整数是不是丑数的解法,直观但不够高效:所谓一个数m是另一个数n的因子,是指n能被m整除,也就是说n%m==0.根据丑数的定义,丑数只能被2,3,5整除。也就是说如果一个数能被2整...转载 2019-03-31 14:18:15 · 163 阅读 · 0 评论 -
【Java】面试题48:最长不含重复字符的子字符串
题目:最长不含重复字符的子字符串请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。例如,在字符串中”arabcacfr”,最长非重复子字符串为”acfr”,长度为4。**主要思路:**使用动态规划,记录当前字符之前的最长非重复子字符串长度f(i-1),其中i为当前字符的位置。每次遍历当前字符时,分两种情况:1)若当前字符第...转载 2019-03-31 11:24:27 · 3763 阅读 · 0 评论 -
【Java】面试题5602 数组中唯一只出现一次的数字
题目:在一个数组中除一个数字只出现一次以外,其他数字都出现了3次。请找出这个数字思路:首先看看题目要求:数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次。请给出最快的方法找到x。应该如何思考呢?如果是两个相同的就可以利用两个相同的数异或结果为0来计算的,但这个题目中其他数字是出现了3次,因此肯定不可以再使用异或了。我们换一个角度来看,如果数组中没有x,那么数组中所有的...原创 2019-04-04 15:00:55 · 230 阅读 · 0 评论 -
【Java】面试题5601 数组中数字出现的次数
题目一:数组中只出现一次的两个数字一个整型数组里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度O(n),空间复杂度为O(1)【解题思路】位运算除了有两个数字只出现了一次,其他数字都出现了两次。异或运算中,任何一个数字和自己本身异或都是0,任何一个数字和0异或都是本身。如果尝试把原数组分成两个子数组,且刚好每个子数组中各自包含一个只出现一次的数字...原创 2019-04-04 13:52:18 · 258 阅读 · 0 评论 -
【Java】面试题5502:输入一棵平衡二叉树的根节点,判断该树是不是平衡二叉树
题目二:平衡二叉树输入一棵平衡二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树深度相差不超过1,那么它就是一棵平衡二叉树。思路:有了求二叉树深度的经验之后再解决这个问题,很容易想到一种思路,在遍历树的灭个节点的时候,从上到下调用函数求左右子树的深度。如果每个节点的左右子树深度相差不超过过1,则为平衡二叉树。然而这个方法右缺点:由于一个节点会被重复遍历多次,这种思...原创 2019-04-04 10:03:53 · 711 阅读 · 1 评论 -
【Java】面试题55:二叉树的深度
题目一:二叉树的深度题目一:二叉树的深度输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点形成树的一条路径,最长路径的长度为树的深度。从根节点到叶节点依次经过的节点形成树的一条路径,最长路径的长度为树的深度。思路:package jianZhiOffer;/* * 面试题55:二叉树的深度 * 题目一:二叉树的深度 * 输入一棵二叉树的根节点,求该树的深度...原创 2019-04-04 09:55:49 · 244 阅读 · 0 评论 -
【Java】面试题47:礼物的最大价值
1. 题目描述在一个 m*n 的棋盘中的每一个格都放一个礼物,每个礼物都有一定的价值(价值大于0).你可以从棋盘的左上角开始拿各种里的礼物,并每次向左或者向下移动一格,直到到达棋盘的右下角。给定一个棋盘及上面个的礼物,请计算你最多能拿走多少价值的礼物?比如说现在有一个如下的棋盘,在这个棋盘中,按照(1,12,5,7,7,16,5)的顺序可以拿到总价值最大的礼物。2. 题目分析我们首先使用...转载 2019-03-30 11:15:04 · 2197 阅读 · 0 评论 -
【Java】面试题39:数组中出现次数超过一半的数字
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例子说明:如输入一个长度为9的数组{ 1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2 。分析思路1:基于Partition 函数的O(n)算法数组中有一个数字出现的次数超过了数组长度的一半。如果把这个数组排序,那么排序之后位于数组中间的数字一定就是那个...转载 2019-03-26 15:26:10 · 159 阅读 · 0 评论 -
【Java】面试题46:把数字翻译成字符串
题目描述:给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。分析思路:用递归自顶向下分析,用动态规划自低向上求解•定义问题:当最开始的一个或者两个数字被翻译成一个字符后,我们接着翻译后面剩下的...转载 2019-03-30 09:37:15 · 398 阅读 · 0 评论 -
面试题62:圆圈中最后剩下的数字
题目:0,1,…,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。 求出这个圆圈里剩下的最后一个数字。用数组实现: //利用数组实现 public static int getLastNum(int n,int m) { if(n<1 || m<1) return -1; int num[] = new int[n]; int ...转载 2019-04-10 21:09:17 · 183 阅读 · 0 评论 -
【Java】面试题60:n个骰子的点数
题目:把n个骰子扔到地上,所有骰子朝上以面的点数之和为s。 输入n,打印出s的所有可能值出现的概率方法一:动态规划动态规划法求解的总体过程就是将问题分为多个不同的阶段的问题,根据最开始阶段已知的问题的解逐步推导出最终解。即动态规划算法通常基于一个递推公式及一个或多个初始状态。过程细化为:第一步,确定问题的解的表达式,称之为状态。第二步,将最终问题的构造成上一阶段问题的解(可能被拆分为多个...转载 2019-04-10 18:34:53 · 336 阅读 · 0 评论 -
面试题61:扑克牌中的顺子
题目:从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的。 2-10为数字本身,A为1,J为11,Q为12,K为13,而大,小王可以看成任意数字思路:1、排序2、计算所有相邻数字间隔总数3、计算0的个数4、如果2、3相等,就是顺子5、如果出现对子,则不是顺子package jianZhiOffer;import java.util.Arrays;/* * ...原创 2019-04-10 19:42:37 · 213 阅读 · 0 评论 -
Java【面试题67】: 把字符串转换成整数
题目:把字符串转换成整数要求不能使用字符串转整数的库函数。数值为0或者字符串不是一个合法输入的数值则返回0思路:需要注意的点:1.只输入一个符号时怎么处理2.输入不是数字的其他符号类型时3.输入的字符串大于整型范围时,考虑溢出3.空串或者长度为0时字符’0’对应的ASCII码值是48(转化为int类型);字符’9’对应的ASCII码值是57 (48+10-1=57);pac...原创 2019-04-12 20:40:59 · 888 阅读 · 1 评论 -
【Java】面试题59:队列的最大值
题目一:滑动窗口的最大值给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小为3,那么移动存在6个活动窗口,它们的最大值分别为{4,4,6,6,6,5}.思路:借助一个辅助队列,从头遍历数组,根据如下规则进行入队列或出队列操作:0. 如果队列为空,则当前数字入队列如果当前数字大于队列尾,则删除队列尾,直到当...转载 2019-04-09 13:58:34 · 672 阅读 · 1 评论 -
【Java】面试题54:二叉搜索树的第k大的节点
题目:给定一棵二叉搜索树,请找出其中第k大的节点。例如,下图中的二叉搜索树中,按节点数值大小顺序第三个节点的值 是4.算法分析:如果按照中序遍历的顺序遍历一棵二叉搜索树,遍历序列的数值是递增排序的。上图中的二叉搜索树的中序遍历序列为{2,3,4,5,6,7,8},因此,只需要用中序遍历算法遍历一棵二叉搜索树,就很容易找出它的第k大结点。方法一:递归中序遍历package jianZhi...原创 2019-04-03 14:49:42 · 806 阅读 · 1 评论 -
【Java】面试题53:在排序数组中查找数字
题目一:数字在排序数组中出现的次数统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.由于数组是单调递增的,所以可以采用二分查找思路:利用二分查找法的变形分别找到第一个要找的值的下标和最后一个要找的值的下标,时间复杂度为 O(logn)。1.如何利用二分查找找到第一个k?二分查找算法总是先拿数组中...原创 2019-04-03 11:08:10 · 474 阅读 · 0 评论 -
【Java】面试题58:翻转字符串
题目一:翻转单词顺序输入一个英文句子,翻转句子中单词顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入I am a student. 则输出student. a am I思路一:将字符串按照一个空格分割,反向重新组合字符串 public static String ReverseSentence(String str) { //.trim()去掉字符串两...转载 2019-04-09 09:36:11 · 165 阅读 · 0 评论 -
【Java】面试题57:和为s的数字
题目一:和为s的两个数字输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字和等于s,则输出任意一堆即可。思路:数列满足递增,设两个头尾两个指针i和j,1、若ai + aj == sum,就是答案(相差越远乘积越小)2、若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 13、若ai + a...转载 2019-04-08 21:58:06 · 187 阅读 · 0 评论 -
[Java】 面试题52:两个链表的第一个公共节点
题目:输入两个链表,找出他们的第一个公共节点可以发现两个链表在第一个节点重合之后不会再分开了简单多说一句不会分开的原因,因为单向链表的节点只有一个nextNode指向下一个节点,那么如果该节点重合了,那么后面的节点一定是同一个如果直观点对这个图形进行解释就是两个链表重合之后呈现一个Y型而不是一个X型解决问题一般这种问题要用两个类似指针的东西,一个先走,一个后走所以我们先遍历找到两个链...转载 2019-04-02 13:14:18 · 336 阅读 · 1 评论 -
【Java】面试题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]。不能使用除法思路:将计算过程画出来,寻找规律如上图所示,每行跳过红色数字,黑色数字的乘积就是对应的B[i].那么以红色数字为分割线,左侧数组设为D,右侧设为C,则B= C*D;则D[0] = 1; D[i] = D[...转载 2019-04-11 16:03:16 · 143 阅读 · 0 评论 -
【Java】面试题65:不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求再函数体内不得使用+,-,*,/四则运算符号思路:首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2。 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。 第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。同样我们可以用三步走的方式计算二进制值相加:5...原创 2019-04-11 15:25:34 · 127 阅读 · 0 评论 -
【Java】面试题64:求1+2+...+n
题目:求1+2+…+n,要求不能使用乘除法,for while,if,else,switch,case等关键字及条件判断语句思路:借助&&的短路功能,对于 A && B,有如下规则若A = true,则执行B若A = false,则不执行B如果n=0时,则不会再进行递归调用package jianZhiOffer;/* * 面试题64:求1+2+...转载 2019-04-11 15:02:24 · 387 阅读 · 0 评论 -
【Java】面试题63:股票的最大利润
题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14},如果我们能在价格为5的时候买入并在16时卖出,则能收获最大的利润11.一、股票的最大利润(一次卖出)一个数组代表股票每天的价格,可以选择从某一天买入,然后之后的一天卖出,求能够获得的最大收益。例如,一只股票在某些时间...转载 2019-04-11 14:28:08 · 1198 阅读 · 1 评论 -
【Java】面试题51:数组中的逆序对
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对, 分别是(7,5),(7,4),(6,4),(5,4).思路:看到这个题目,我们的第一反应就是顺序扫描整个数组。每扫描到一个数组的时候,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,则这两个数字就组...原创 2019-04-02 10:18:05 · 281 阅读 · 0 评论 -
【Java】面试题43:1-n整数中1出现的次数
题目:输入一个整数,求1-n这n个整数的十进制表示中1出现的次数。例如,输入12,1-12这些整数中包含1的数字有1,10,11和12,1义工出现了5次解题思路考虑将n的十进制的每一位单独拿出讨论,每一位的值记为weight。1) 个位从1到n,每增加1,weight就会加1,当weight加到9时,再加1又会回到0重新开始。那么weight从0-9的这种周期会出现多少次呢?这取决于n的...转载 2019-03-28 10:43:57 · 194 阅读 · 0 评论 -
【Java】面试题38:字符串的排列
题目:输入一个字符串,打印出该字符串的所有排列。例如,输入字符串abc,则打印出所有字符串:abc,acb,bac,bca,cab,cba思路:面对这样的题目,我们需要将复杂问题分解化,分解成一个一个小问题。将一个字符串分为两部分:第一部分为它的第一个字符,第二部分为后面所有的字符,如下图所示:求整个字符串的全排列,可以看成两步:第一步首先求所有可能出现在第一个位置的字符,即把第一个字符和...转载 2019-03-26 10:15:31 · 137 阅读 · 0 评论 -
【Java】面试题45:把数组排成最小的数
题目:把数组排成最小的数 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323.算法分析:1.最直接的办法就是先求出这个数组中所有数字的全排列,然后把每个排列拼接起来,最后求出拼接起来的数字的最小值。求数组的排列和字符串排列非常相近。根据排列组合知识,n个数字...转载 2019-03-29 15:43:07 · 200 阅读 · 0 评论 -
【Java】 面试题26:树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。例如图中所示的两棵二叉树,由于A中有一部分子树的结构和B 是一样的,因此B是A的子结构。要查找树A中是否存在和树B结构一样的子树,思路是第一步:先在树A中查找与根结点的值一样的结点,这实际就是树的先序遍历,当树A和树B为空时,定义相应的输出。如果树A某一结点的值和树B头结点的值相同,则调用doesTree1HaveTree2,做第二步判断。...转载 2019-03-14 18:58:43 · 131 阅读 · 0 评论 -
【Java】面试题12:矩阵中的路径
面试题12:矩阵中的路径题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b t g c f c s j d e h 矩阵中包含一条字符串”bfce”的路径,但是矩阵中不包含”abfb”路径,因为字...转载 2019-03-04 17:34:39 · 167 阅读 · 0 评论 -
【Java】 面试题25:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然使递增排序的。题目分析 假如List1中的头节点是小于List2中的,那么新的链表的头节点必将是List1的头节点,同理对List2也一样,那么在比较完头节点之后,再将List1中的下一个节点再与List2中的头节点比较,同样谁小谁进入新链表,然后再比较,直到两个链表比较完,故可用非递归或递归两种方式来做。递归求解:pac...原创 2019-03-14 15:00:25 · 122 阅读 · 0 评论 -
【Java】 面试题24:反转链表
面试题24:反转链表 题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点package jianZhiOffer;/* * 面试题24:反转链表 * 题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点 */public class Demo24 { private static int ReverseList1(ListNode ...原创 2019-03-14 11:26:00 · 147 阅读 · 0 评论 -
【Java】面试题11:旋转数组的最小数字
面试题11:旋转数组的最小数字题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的旋转,输出旋转数组的最小元素。例如:数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小元素为1.这道题最直观的解法并不难,从头到尾遍历一次,我们就能找到最小...原创 2019-03-04 15:26:32 · 117 阅读 · 0 评论 -
【Java】面试题16:数值的整数次方
面试题16:数值的整数次方实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题要考虑底数base不能为0指数为0,为负等情况优化powerWithExponent()方法我们可以直接借助于乘方的数学公式进行求解。a^n = a^(n/2) * a^(n/2);n为偶数;a^n ...转载 2019-03-06 14:22:03 · 112 阅读 · 0 评论 -
【Java】 面试题18:删除链表的结点,删除链表中重复的节点
题目一:在O(1)时间内删除链表的节点给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除节点把需要删除的节点的下一个节点的内容复制待需要删除的节点上覆盖原有的内容,再把下一个节点删除。package jianZhiOffer;/* * 面试题18:删除链表的节点 * 题目一:在O(1)时间内删除链表节点 * 给定单向链表的头指针和一个节点指针,定义一个函数在O(1...转载 2019-03-08 16:39:11 · 94 阅读 · 0 评论 -
【Java】面试题15:二进制中1的个数
面试题15:二进制中1的个数**题目:**请实现一个函数,输入一个整数,输出该数的二进制表示中1的个数。例如:9的二进制为1001,有2位是1.因此,如果输入9,则该函数输出2解法1:常规先把n和1做与运算,判断n的最低为是不是1.接着把1左移一位得到2,再和n做与运算,就能判断n的次低位是不是1…这样反复左移方法2:把整数减去1,再和原整数做与运算,会把该整数最右边的1变成0. 那么一...原创 2019-03-06 10:19:01 · 180 阅读 · 0 评论