剑指offer刷题
剑指offer刷题
小鑫-Chen
持之以恒
展开
-
剑指offer之面试题66:构建乘积数组
面试题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]。不能使用除法。思路1:以{1, 2, 3, 4, 5}为例第一次可以看做 1 和 2×3×4×5×1 相乘第二次可以看做 1×1 和 3×4×5×1 相乘第三次可以看做 1×1×2 和 4×5×1 相乘第四次可以看做 1×1×2×3 和 5原创 2021-05-07 17:31:50 · 118 阅读 · 0 评论 -
剑指offer刷题之65:不用加减乘除做加法
面试题65:不用加减乘除做加法题目:写一个函数,求两个整数之和,要求在函数体内不得使用"+"、"-"、“×”、"÷"四则运算符号思路:以十进制为例,5+17:首先每位单独相加,得到sum=12,然后计算进位,10。然后将12和10相加,得到sum=22,进位为0。所以结果为22。现在以二进制为例,5的二进制表示是101,17的二进制表示是10001。第一轮sum=10100,进位为10,然后10100和10相加,结果为10110,没有进位,所以结果为22。在二进制的计算中,sum的计算可以用原创 2021-05-07 16:43:36 · 151 阅读 · 0 评论 -
剑指offer之面试题64:求1+2+...+n
面试题64:求1+2+…+n题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字即条件判断语句(A?B:C)思路:使用逻辑与的短路特性和递归代码实现:package Question64;public class T01 { public static void main(String[] args) { System.out.println(solve(6)); } public stati原创 2021-05-06 15:34:48 · 63 阅读 · 0 评论 -
剑指offer之面试题63:股票的最大利润
面试题63:股票的最大利润题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9, 11, 8, 5, 7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。思路:动态规划数组dp中存储当前这个时刻之前,最低的买入价格。代码实现:package Question63;public class T01 { public static void m原创 2021-05-06 15:18:43 · 76 阅读 · 0 评论 -
剑指offer之面试题62:圆圈中最后剩下的数字
面试题62:圆圈中最后剩下的数字题目:0,1,…,n-1 这 n 个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。思路1:环形链表在leetcode上超时了!!代码实现:package Question62;public class T01 { public static void main(String[] args) { System.out.println(solve(5, 3)); } p原创 2021-05-06 15:03:11 · 93 阅读 · 0 评论 -
剑指offer之面试题61:扑克牌的顺子
面试题61:原创 2021-05-06 14:09:09 · 88 阅读 · 0 评论 -
剑指offer之面试题60:n个骰子的点数
面试题60:n个骰子的点数题目:把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。原创 2021-05-04 18:48:25 · 89 阅读 · 0 评论 -
剑指offer之面试题59:队列的最大值
面试题59:队列的最大值题目1:滑动窗口的最大值给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}。思路1:...原创 2021-05-04 09:22:57 · 93 阅读 · 0 评论 -
剑指offer之面试题58:翻转字符串
面试题58:翻转字符串题目一:翻转单词顺序输入一个英文句子,翻转句子中单词的顺序,但单词内的顺序不变。为简单起见,标点符号和普通字符一样处理。例如,输入字符串"I am a student.",则输出...原创 2021-04-29 15:01:48 · 127 阅读 · 0 评论 -
剑指offer之面试题57:和为s的数字
面试题57:和为s的数字题目一:和为 s 的两个数字输入一个递增排序的数组和一个数字,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。思路1:利用hash表用hash表记录每个数字出现的次数,然后再次遍历数组,当遍历到某个值为 val 时,就判断 target - val 在不在数组中。代码实现:package Question57;import java.util.Arrays;import java.util.HashMap;import原创 2021-04-24 19:23:20 · 60 阅读 · 0 评论 -
剑指offer面试题56:数组中数字出现的次数
面试题56:数组中数字出现的次数题目一:数组中只出现一次的两个数字一个整型数组里除两个数字之外,其它数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:用哈希表存储每个数字出现的次数代码实现:...原创 2021-04-24 19:05:59 · 127 阅读 · 0 评论 -
剑指offer之面试题55:二叉树的深度
面试题55:二叉树的深度题目一:二叉树的深度输入一颗二叉树的根节点,求该数的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。思路:遍历二叉树,遍历的同时保存该节点的深度。(solve2的方法写的更简单,这种比较好)代码实现:package Question55;public class T01 { private static int maxDepth = 0; public static void main(String原创 2021-04-24 11:04:29 · 74 阅读 · 0 评论 -
剑指offer之面试题54:二叉搜索树的第k大节点
面试题54:原创 2021-04-24 10:22:46 · 85 阅读 · 0 评论 -
剑指offer之面试题53:在排序数组中查找数字
面试题53:在排序数组中查找数字题目一:统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。思路:使用二分查找法找到3,然后在左和右找是不是还有3,最后输出3的个数。代码实现:package Question53;public class T01 { public static void main(String[] args) { int[] arr = {1,3,3,3,3,10原创 2021-04-24 09:49:48 · 94 阅读 · 0 评论 -
剑指offer之面试题52:两个链表的第一个公共节点
面试题52:两个链表的第一个公共节点题目:输入两个链表,找出它们额第一个公共节点。思路:首先遍历这两个链表,找到链表的长度分别为len1和len2如果len1 > len2,则 tempA 走 len1-len2 步,反之 tempB 走 len2 - len1 步tempA 和 tempB 同时向前走,直到tempA.hashCode == tempB.hashCode代码实现:package Question52;public class T01 { public原创 2021-04-20 14:15:53 · 65 阅读 · 0 评论 -
剑指offer之面试题51:数组中的逆序对
面试题51:数组中的逆序对题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,在数组{7, 5, 6, 4}中,一共存在5个逆序对,分别是(7, 6)(7,5)(7,4)(6, 4)和(5, 4)。思路:代码实现:package Question51;import java.util.Arrays;public class T01 { static int count; public原创 2021-04-20 11:50:44 · 114 阅读 · 0 评论 -
剑指offer之面试题50:第一个只出现一次的字符
面试题50:第一个只出现一次的字符题目:字符串中第一个只出现一次的字符。在字符串中找出第一个只出现一次的字符。如输入"abaaadeff"。则输出’b’。思路:遍历两边字符串第一遍:将字符串中每个字符的出现次数记录再hashMap中第二遍:找出第一个出现次数为一次的字符。代码实现:package Question50;import java.util.HashMap;import java.util.Map;public class T01 { public stat原创 2021-04-19 19:20:42 · 196 阅读 · 0 评论 -
剑指offer之面试题49:丑数
面试题49:丑数题目:我们把只包含因子2,3,5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如,6,8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当作第一个丑数。...原创 2021-04-19 18:25:28 · 112 阅读 · 0 评论 -
剑指offer之面试题48:最长不含重复字符的子字符串
面试题48:最长不含重复字符的子字符串题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含’a’~'z’的字符。例如,在字符串"arabcacfr"中,最长的不含重复字符的子字符串是"acfr",长度为4。...原创 2021-04-19 11:41:54 · 82 阅读 · 0 评论 -
剑指offer之面试题47:礼物的最大价值
面试题47:礼物的最大价值题目:在一个 m × n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或向下移动一格,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?思路:动态规划。dp[i][j] 表示以map[i][j]的时候能拿到的礼物的最大价值。转移方程:dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + map[i][j];代码实现:packag原创 2021-04-18 09:52:31 · 159 阅读 · 0 评论 -
剑指offer面试题之46:把数字翻译成字符串
面试题46:把数字翻译成字符串题目:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成"a",1 翻译成"b",…,11翻译成"l",…,25翻译成"z"。一个数字可能有多个翻译。例如,12258 有 5 种不同的翻译,分别是"bccfi",“bwfi”,...原创 2021-04-17 23:50:31 · 68 阅读 · 0 评论 -
剑指offer面试题之45:把数组排成最小的数
面试题45:把数组排成最小的数题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如:输入数组{3, 32, 321},则打印出这 3 个数字能排成的最小数字 321323。思路:定义一个比较器,比较 str1+str2 和 str2+str1 哪个小。取小的那种方式。代码实现:package Question45;import java.util.*;public class T01 { public static void ma原创 2021-04-17 21:51:46 · 134 阅读 · 0 评论 -
剑指offer之面试题44:数字序列中某一位的数字
面试题44:数字序列中某一位的数字原创 2021-04-17 19:00:20 · 130 阅读 · 0 评论 -
剑指offer之面试题43:1~n整数中1出现的次数
面试题43:1~n整数中1出现的次数题目:输入一个整数 n,求 1~n 这 n 个整数的十进制表示中 1 出现的次数。例如,输入 12,1-12 这些整数中包含 1 的数字有 1、10、11 和 12,1 一共出现了 5 次。思路1:暴力解法,累加1-n中每个整数中1出现的次数。代码实现:package Question43;public class T01 { public static void main(String[] args) { int n = 12;原创 2021-04-17 10:45:22 · 68 阅读 · 0 评论 -
剑指offer之面试题42:连续子数组的最大和
面试题42:连续子数组的最大和题目:输入一个整型数组,数组里有整数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。思路:动态规划dp[i] 表示以第 i 个元素作为尾元素能得到的最大的值。代码实现:package Question42;import java.util.Arrays;public class T01 { public static void main(String[] args) { int原创 2021-04-16 21:59:48 · 111 阅读 · 0 评论 -
剑指offer之面试题41:数据流中的中位数
面试题41:数据流中的中位数如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。因为是数据流,所以需要随时能得到目前已获得数据的中位数。思路1:每次都进行排序。(这种方法在 leetcode 上会超出时间限制)代码实现:class MedianFinder { private List<Double> list; /** init原创 2021-04-16 21:31:55 · 85 阅读 · 0 评论 -
剑指offer之面试题40:最小的 k个数
面试题40:最小的 k 个数输入 n 个整数,找出其中最小的 k 个数。例如,输入4,5,1,6,2,7,3,8 这8个数字,则最小的4个数字为 1,2,3,4。思路1:对数组排序,时间复杂度 O(nlogn)代码实现:package Question40;import java.util.Arrays;public class T01 { public static void main(String[] args) { int[] arr = {4, 3, 2,原创 2021-04-16 20:13:51 · 88 阅读 · 0 评论 -
剑指offer之面试题39:数组中出现次数超过一半的数字
面试题39:数组中出现次数超过一半的数字题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如,输入一个长度为 9 的数组 {1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.思路1:因为这个数字出现的次数超过了一般,所以它的出现次数比其他数字出现次数的总和还要多。我们在遍历数组时保存两个值,一个是数组中的数字,一个是次数。当我们遍历到下一个数字的时候,如果它与保存的数字相同,则次数加1,否则次数减1。当次数为 0 的时候,重新初始原创 2021-04-16 19:15:43 · 69 阅读 · 0 评论 -
剑指offer之面试题38:字符串的排列
面试题38:字符串的排列题目:输入一个字符串,打印出该字符串中字符的所有排列。例如,输入字符串abc,则打印出由字符 a、b、c 所能排列出来的所有字符串 abc、acb、bac、bca 和 cba。思路:把整个字符串的排列,看成两步:一、求出所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。二、固定第一个字符,求后面所有字符的排列。在求后面所有字符的排列的时候,也按照同样的方法来计算。代码实现:package Question38;import java.util原创 2021-04-14 09:55:26 · 229 阅读 · 0 评论 -
剑指offer之面试题37:序列化二叉树
面试题37:序列化二叉树题目:请实现两个函数,分别用来序列化和反序列化二叉树思路:因为从前序遍历序列和中序遍历序列中可以恢复出一棵二叉树,所以不难想到把一棵二叉树序列化成一个前序遍历序列和一个中序遍历序列。然后在反序列化时通过这两个序列重构出原二叉树。但是这样做有两个缺点:①该方法要求二叉树中不能有数值重复的节点;②只有当两个序列中所有数据都读出后才能开始反序列化。如果两个遍历序列的数据是从一个流中读出来的,那么可能需要等待较长的时间。实际上,如果二叉树的序列化是从根节点开始的,那么相应的反序原创 2021-04-13 19:31:15 · 83 阅读 · 0 评论 -
剑指offer之面试题36:二叉搜索树与双向链表
面试题36:二叉搜索树与双向链表题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。原创 2021-04-12 10:01:12 · 70 阅读 · 0 评论 -
剑指offer面试题35:复杂链表的复制
面试题35:复杂链表的复制题目:请实现函数 ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个节点除了有一个 m_pNext 指针指向下一个节点,还有一个 m_pSibling 指针指向链表中的任意节点或者 nullptr,节点的 C++ 定义如下:struct ComplexListNode { int m_nValue; ComplexListNode* m_pNext; ComplexListNode* m_原创 2021-04-11 11:33:46 · 81 阅读 · 0 评论 -
剑指offer之面试题34:二叉树中和为某一值的路径
面试题34:二叉树中和为某一值的路径题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过所经过的节点形成一条路径。代码实现:...原创 2021-04-11 09:27:48 · 155 阅读 · 0 评论 -
剑指offer之面试题33:二叉搜索数的后序遍历序列
面试题33:二叉搜索树的后序遍历序列题目:输入一个整数数组,判断该数组是不是某二叉搜索数的后序遍历结果。如果是返回 true,如果不是返回 false。假设输入的数组的任意两个数字都互不相同。例如,输入数组 {5, 7, 6, 9, 11, 10, 8},则返回true,因为这个整数序列是下图二叉搜索树的遍历结果。如果输入的数组是 {7, 4, 6, 5},则由于没有哪棵二叉树搜索树的后序遍历结果是这个序列,因此返回 false。思路:数组中最后的值是根节点的值。根据二叉搜索数的特性,数组中前原创 2021-04-10 10:23:03 · 66 阅读 · 0 评论 -
剑指offer之面试题32:从上到下打印二叉树
面试题32:从上到下打印二叉树题目一:不分行从上到下打印二叉树从上到下打印出二叉树的每个节点,同一层的节点按照从做到右的顺序打印。例如下图的二叉树,则依次打印出 8 6 10 5 7 9 11。思路:借助队列实现二叉树的层序遍历代码实现:这里写复杂了,后面有时间再改(用T03的方法)package Question32;import java.util.Arrays;import java.util.LinkedList;import java.util.Queue;publi原创 2021-04-08 20:27:22 · 106 阅读 · 0 评论 -
剑指offer之面试题31:栈的压入、弹出序列
面试题31:栈的压入、弹出序列题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如 {1, 2, 3, 4, 5} 是某栈的压栈序列,序列 {4, 5, 3, 2, 1} 是该栈序列对应的一个弹出序列,但 {4, 3, 5, 1, 2} 就不可能是该压栈序列的弹出序列。思路:以弹出序列 {4, 5, 3, 2, 1} 为例,第一个希望被弹出的是数字 4,因此需要 4 入栈。压入栈的顺序由压栈序列确定,也就是在把 4 压入栈之原创 2021-04-08 16:31:09 · 101 阅读 · 0 评论 -
剑指offer之面试题30:包含 min 函数的栈
面试题30:包含 min 函数的栈题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数。在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。思路:第一种思路:对栈排序,然后得到最小的元素。缺点:改变了栈中元素的顺序,不符合栈的要求。第二种思路:定义一个变量保存栈中最小元素。缺点:最小元素出栈时咋整?第三种思路:定义一个辅助栈,栈顶元素永远是当前栈中的最小元素。代码实现:package Question30;public class原创 2021-04-08 15:30:09 · 62 阅读 · 0 评论 -
剑指offer之面试题29:顺时针打印矩阵
面试题29:顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。思路:定义四个边界 startX = 0、endX = arr.length、startY = 0、endY = arr[0].length首先从左往右走,走完后 startX++然后从上往下走,走完后 endY–然后从右往左走,走完后 endX–最后从下往上走,走完后 startX++每次 startX、endX、startY、endY变化,都要判断一下,startX 有没有超过 endX,st原创 2021-04-07 20:16:39 · 60 阅读 · 0 评论 -
剑指offer之面试题28:对称的二叉树
面试题28:对称的二叉树题目:请实现一个函数,用来判断一颗二叉树是不是对称的。如果一颗二叉树和它的镜像一样,那么它是对称的。如下图所示的二叉树就是对称的。思路:前序遍历:中左右 8657675对称前序遍历:中右左 8657675同时进行前序遍历和对称前序遍历,如果遍历结束全部相等则是对称二叉树,否则不是代码实现:package Question28;public class T01 { public static void main(String[] args) {原创 2021-04-07 13:14:04 · 74 阅读 · 0 评论 -
剑指offer之面试题27:二叉树的镜像
面试题27:二叉树的镜像题目:请完成一个函数,输入一颗二叉树,该函数输出它的镜像。思路:遍历所有的节点每次遍历到一个节点,交换该节点的左右子树代码实现:package Question27;public class T01 { public static void main(String[] args) { Node nodeA1 = new Node(1); Node nodeA2 = new Node(2); Node n原创 2021-04-07 12:49:12 · 77 阅读 · 0 评论