剑指offer
依嘫_吃代码
这个作者很懒,什么都没留下…
展开
-
java面试题67. 把字符串转换成整数
字符串处理 模拟写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。原创 2022-12-14 15:54:23 · 147 阅读 · 0 评论 -
Java面试题61. 扑克牌中的顺子
就是判断从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。代码案例:输入: [1,2,3,4,5]输出: True。原创 2022-12-14 15:10:10 · 160 阅读 · 0 评论 -
java-面试题59 - II. 队列的最大值
双端队列请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1代码案例:输入:输出: [null,null,null,2,1,2]原创 2022-12-14 15:03:31 · 76 阅读 · 0 评论 -
java 面试题45. 把数组排成最小的数
用的Java内置的compareTo函数输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。代码案例:输入: [10,2]输出: “102”原创 2022-12-14 13:17:24 · 51 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先
二叉树递归最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]原创 2022-12-14 12:43:25 · 54 阅读 · 0 评论 -
java 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
利用二叉搜索树的特性给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]原创 2022-12-14 12:14:17 · 62 阅读 · 0 评论 -
java 剑指 Offer 66. 构建乘积数组
前后缀分解给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。代码案例:输入: [1,2,3,4,5]输出: [120,60,40,30,24]提示:所有元素乘积之和不会溢出 32 位整数。原创 2022-12-14 11:58:53 · 70 阅读 · 0 评论 -
java剑指 Offer 65. 不用加减乘除做加法
位运算写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。代码案例:输入: a = 1, b = 1输出: 2提示:a, b 均可能是负数或 0结果不会溢出 32 位整数。原创 2022-12-13 13:16:15 · 64 阅读 · 0 评论 -
java 剑指 Offer 64. 求1+2+…+n(2种方法)
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。代码案例:输入: n = 3输出: 6。原创 2022-12-13 13:12:47 · 199 阅读 · 0 评论 -
java剑指 Offer 63. 股票的最大利润
属于股票交易时机的系列 点这里假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?代码案例:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。原创 2022-12-13 12:56:31 · 152 阅读 · 0 评论 -
java 剑指 Offer 62. 圆圈中最后剩下的数字 递归写法(约瑟夫问题)
约瑟夫问题递推做法0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。代码案例:输入: n = 5, m = 3输出: 3。原创 2022-12-13 12:49:39 · 117 阅读 · 0 评论 -
java 剑指 Offer 60. n个骰子的点数+acwing80. 骰子的点数
动态规划 先看acwing的骰子的点数 在看这道题就好理解的多acwing的那道题是求f[i][j] 表示前i次总和是j的掷法数除以总数就是6的n次方把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。代码案例:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]原创 2022-12-13 12:35:54 · 90 阅读 · 0 评论 -
java 剑指 Offer 59 - I. 滑动窗口的最大值(两种模板)
滑动窗口的最大值 属于单调队列的模板题本文中介绍了两种方式来求解滑动窗口最大值的模板与acwing中的这个相似给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。代码案例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:滑动窗口的位置 最大值--------------- -----原创 2022-12-13 11:34:18 · 303 阅读 · 0 评论 -
java 剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。代码案例:输入: s = “abcdefg”, k = 2。简单做法可以使用Java中字符串的substring方法。substring方法中范例介绍。输出: “cdefgab”原创 2022-12-12 15:45:32 · 65 阅读 · 0 评论 -
java 剑指 Offer 43. 1~n 整数中 1 出现的次数
例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。代码案例:输入:n = 12。原创 2022-12-12 15:36:28 · 217 阅读 · 0 评论 -
java-剑指 Offer 58 - I. 翻转单词顺序
以单词级别进行翻转输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。代码案例:输入: “the sky is blue”输出: “blue is sky the”原创 2022-12-12 15:24:03 · 168 阅读 · 0 评论 -
java 剑指 Offer 57 - II. 和为s的连续正数序列
双指针的做法 O(n)的时间复杂度同时末尾有List res 这种的转化成二位数组输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。代码案例:输入:target = 9输出:[[2,3,4],[4,5]]原创 2022-12-12 14:43:20 · 378 阅读 · 0 评论 -
java 剑指 Offer 57. 和为s的两个数字
利用hashset的特性进行求解输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。代码案例:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]原创 2022-12-11 22:38:44 · 64 阅读 · 0 评论 -
Java剑指 Offer 56 - II. 数组中数字出现的次数 II
类似状态机的位运算借鉴了状态机的思想 (0,0)-> (1,0)->(0,1)的转变在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。代码案例:输入:nums = [3,4,3,3]输出:4。原创 2022-12-11 22:34:29 · 132 阅读 · 0 评论 -
java——剑指 Offer 56 - I. 数组中数字出现的次数
位运算里面的异或运算异或性质:两个相同的数异或为0一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。代码案例:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]原创 2022-12-11 22:11:21 · 90 阅读 · 0 评论 -
Java剑指 Offer 17. 打印从1到最大的n位数
暴力+分治的思想输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。代码案例:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]原创 2022-11-23 21:36:46 · 142 阅读 · 0 评论 -
剑指offer 72. 平衡二叉树-java
二叉树 递归输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过 1,那么它就是一棵平衡二叉树。注意:规定空树也是一棵平衡二叉树。数据范围树中节点数量 [0,500]。...原创 2022-06-18 20:35:40 · 79 阅读 · 0 评论 -
剑指offer 71. 二叉树的深度-java
输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。数据范围树中节点数量 [0,500]。方法有很多种可以层序遍历出层数 可以dfs遍历 也可以bfs这里面就取巧 直接到底 递归写法...原创 2022-06-17 17:41:59 · 64 阅读 · 0 评论 -
剑指offer 70. 二叉搜索树的第k个结点-java
二分搜索 递归 分治给定一棵二叉搜索树,请找出其中的第 k 小的结点。你可以假设树和 k 都存在,并且 1≤k≤ 树的总结点数。数据范围树中节点数量 [1,500]。要保证所有的dfs函数都公用一个k 所以这里面的k直接定义成全局变量注意:不是 k == 0 找到答案时 就马上终止程序。 如果不加 if (k>0)的 剪枝优化,只有把整棵树遍历完,才会终止程序。...原创 2022-06-17 17:34:07 · 79 阅读 · 0 评论 -
剑指offer 69. 数组中数值和下标相等的元素-java
假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数找出数组中任意一个数值等于其下标的元素。例如,在数组 [−3,−1,1,3,5] 中,数字 3 和它的下标相等。数据范围数组长度 [1,100]。nums[i]-i >= nums[i-1]-(i-1) 是单调的 不过不是严格单调的单调性序列,nums[i] - i,我们需要找到一个nums[i] - i == 0的数...原创 2022-06-17 17:12:34 · 97 阅读 · 0 评论 -
AcWing 68. 0到n-1中缺失的数字-java
一个长度为 n−1 的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0 到 n−1 之内。在范围 0 到 n−1 的 n 个数字中有且只有一个数字不在该数组中,请找出这个数字。数据范围1≤n≤1000样例...原创 2022-06-17 16:21:34 · 57 阅读 · 0 评论 -
剑指offer 67. 数字在排序数组中出现的次数-java
二分统计一个数字在排序数组中出现的次数。例如输入排序数组 [1,2,3,3,3,3,4,5] 和数字 3,由于 3 在这个数组中出现了 4 次,因此输出 4。数据范围数组长度 [0,1000]。首先是排序数组 可以用二分 如果采用双指针 或者哈希表那种的话 复杂度会多 二分的话复杂度低就是寻找两个圆圈一减 二分的话最后l=r 那个点就是K第一个寻找的时候 找到了 然后把left = l第二次再用边界一减 r-left +1 或者l -left + 1也可以...原创 2022-06-17 13:42:05 · 61 阅读 · 0 评论 -
AcWing 66. 两个链表的第一个公共结点-java
输入两个链表,找出它们的第一个公共结点。当不存在公共节点时,返回空节点。数据范围链表长度 [1,2000]。类似追及相遇问题原创 2022-06-17 12:12:39 · 74 阅读 · 0 评论 -
剑指offer-64. 字符流中第一个只出现一次的字符-java
双指针 队列 哈希表请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 go 时,第一个只出现一次的字符是 g。当从该字符流中读出前六个字符 google 时,第一个只出现一次的字符是 l。如果当前字符流没有存在出现一次的字符,返回 # 字符。数据范围字符流读入字符数量 [0,1000]。题比较简单 看代码就可以...原创 2022-06-17 12:05:12 · 66 阅读 · 0 评论 -
AcWing 65. 数组中的逆序对-java
在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。数据范围给定数组的长度 [0,100]。原创 2022-06-14 00:00:28 · 76 阅读 · 0 评论 -
AcWing 63. 字符串中第一个只出现一次的字符-java
字符串处理 可以用哈希表在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出b。如果字符串中不存在只出现一次的字符,返回 # 字符。数据范围输入字符串长度 [0,1000]。原创 2022-06-13 23:58:03 · 78 阅读 · 0 评论 -
剑指offer 62. 丑数-java
多路归并我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含质因子 7。求第 n 个丑数的值。数据范围1≤n≤1000注意:习惯上我们把 1 当做第一个丑数三指针的思想,所以定义3个指针i, j, k。vector存储的是丑数数组,一开始只有1个1,后面 动态添加元素进vector。t取出的是3个指针分别指向的3个子数组(2 3 5)中的最小值。如果最小值是3个子数组中的哪一个,就把里面的指针i j k 增1。因为可能同时出现在原创 2022-06-13 23:54:29 · 83 阅读 · 0 评论 -
剑指offer 61. 最长不含重复字符的子字符串-java
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从 a 到 z 的字符。数据范围输入字符串长度 [0,1000]。两个指针 i 和j 找两个指针的区间长度当发现出现的次数大于1 就j++...原创 2022-06-08 00:21:21 · 67 阅读 · 0 评论 -
剑指offer 60. 礼物的最大价值-java
在一个 m×n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?注意:m,n>0m×n≤1350简单的DP 这里不再做详细讲解 从左上走到左下...原创 2022-06-06 19:53:46 · 81 阅读 · 0 评论 -
剑指offer 59. 把数字翻译成字符串-java
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 a,1 翻译成 b,……,11 翻译成 l,……,25 翻译成 z。一个数字可能有多个翻译。例如 12258 有 5 种不同的翻译,它们分别是 bccfi、bwfi、bczi、mcfi 和 mzi。请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。数据范围输入数字位数 [1,101]。...原创 2022-06-06 19:50:48 · 57 阅读 · 0 评论 -
剑指offer 58. 把数组排成最小的数-java
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组 [3,32,321],则打印出这 3 个数字能排成的最小数字 321323。数据范围数组长度 [0,500]。注意:输出数字的格式为字符串。根据字符串排序 先把数字变成字符串 比较器中按照字符串排序最后拼接输出...原创 2022-06-06 19:38:45 · 66 阅读 · 0 评论 -
剑指offer 57. 数字序列中某一位的数字-java
数字以 0123456789101112131415… 的格式序列化到一个字符序列中。在这个序列中,第 5 位(从 0 开始计数)是 5,第 13 位是 1,第 19 位是 4,等等。请写一个函数求任意位对应的数字。数据范围0≤ 输入数字 ≤2147483647...原创 2022-06-06 19:35:05 · 81 阅读 · 0 评论 -
剑指offer 54. 数据流中的中位数-java
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。数据范围数据流中读入的数据总数 [1,1000]。暴力做法1直接使用PriorityQueue构造大小堆,大顶堆放小于中位数的集合,小顶堆放大于中位数的集合,取得时候,如果是奇数,就取前半部分的最大数,如果是偶数,就取前半部分的最大数和后半部分的最小数的平均数往里放的时候,如果总数是偶数,就往前放,需要现在后半部分过原创 2022-06-06 19:29:25 · 82 阅读 · 0 评论 -
剑指offer 55. 连续子数组的最大和-java
输入一个 非空 整型数组,数组里的数可能为正,也可能为负。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)。数据范围数组长度 [1,1000]。原创 2022-06-06 17:27:49 · 63 阅读 · 0 评论 -
AcWing 53. 最小的k个数-java
快速排序和最大堆的时间复杂度都是 nlogn输入 n 个整数,找出其中最小的 k 个数。注意:输出数组内元素请按从小到大顺序排序;数据范围1≤k≤n≤1000最朴素的做法就是排序 然后输出2、最大堆维护一个大小为k的大根堆,将数组元素都push进堆,当堆中的数大于k时弹出堆顶元素。注意弹出堆顶的顺序是从大到小的k个数,要进行逆序操作最大堆 把最大的数弄出去 剩下的就是最小的数 注意的是 输出是按照从大到小的顺序输出的 所以使用addFirst函数加入到list的头...原创 2022-06-06 17:25:06 · 83 阅读 · 0 评论