剑指offer练习
学而知不足~
这个作者很懒,什么都没留下…
展开
-
Day31:剑指 Offer 44. 数字序列中某一位的数字
题目数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。代码实现K神思路class Solution { public int findNthDigit(int n) { int digit = 1; long start = 1; long count = 9; while (n原创 2022-01-06 21:18:44 · 134 阅读 · 0 评论 -
Day31:剑指 Offer 43. 1~n 整数中 1 出现的次数
题目输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。代码实现数学K神思路class Solution { public int countDigitOne(int n) { int digit = 1, res = 0; int high = n / 10, cur = n % 10, low = 0; while(high != 0原创 2022-01-06 21:15:51 · 253 阅读 · 0 评论 -
Day31:剑指 Offer 14- II. 剪绳子 II
题目给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]*k[1]…*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。代码实现贪心算法class Solution { publi原创 2022-01-06 21:03:01 · 251 阅读 · 0 评论 -
Day30:剑指 Offer 51. 数组中的逆序对
题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。代码实现归并排序(分治算法的应用)class Solution { int res = 0; public int reversePairs(int[] nums) { if (nums.length < 2){ return 0; } process(nums,0,nums.le原创 2022-01-06 20:04:53 · 69 阅读 · 0 评论 -
Day30:剑指 Offer 17. 打印从1到最大的n位数
题目输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。代码实现大数解法K神思路class Solution { int[] res; int nine = 0, count = 0, start, n; char[] num, loop = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; public int[] printNumbe原创 2022-01-06 18:11:20 · 126 阅读 · 0 评论 -
Day29:剑指 Offer 60. n个骰子的点数
题目把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。代码实现动态规划class Solution { public double[] dicesProbability(int n) { //dp[i]第i小的元素的概率 double[] dp = new double[6]; //初始化原创 2022-01-06 17:35:47 · 138 阅读 · 0 评论 -
Day29:剑指 Offer 49. 丑数
题目我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。代码实现动态规划理解:可以说是A马一次只能跳两格,B马一次只能跳3格,C马一次只能跳5格。哪匹马落后最多,哪匹马就多跳一次,周而复始,直到总跳数为n。class Solution { public int nthUglyNumber(int n) { int[] dp = new int[n]; dp[0] = 1; int原创 2022-01-06 16:52:17 · 47 阅读 · 0 评论 -
Day29:剑指 Offer 19. 正则表达式匹配
题目请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。代码实现动态规划class Solution { public boolean isMatch(String s, String p) { int m = s.length()+1;原创 2022-01-06 16:27:40 · 55 阅读 · 0 评论 -
Day28:剑指 Offer 38. 字符串的排列
题目输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。代码实现深度优先回溯class Solution { List<String> list = new LinkedList<>(); public String[] permutation(String s) { char[] chars = s.toCharArray(); dfs(chars,0);原创 2022-01-05 20:49:37 · 59 阅读 · 0 评论 -
Day28:剑指 Offer 37. 序列化二叉树
题目请实现两个函数,分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。代码实现层序遍历public class Codec { // Encodes a tree to a single string. public String serialize(TreeNode root) {原创 2022-01-05 20:31:47 · 53 阅读 · 0 评论 -
Day27:剑指 Offer 59 - II. 队列的最大值
题目请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1代码实现单调双端队列class MaxQueue { //queue1用于存数据,queue2用于存最大值 Deque<Integer> queue1; Deque<Integer> qu原创 2022-01-05 19:46:34 · 64 阅读 · 0 评论 -
Day27:剑指 Offer 59 - I. 滑动窗口的最大值
题目给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。代码实现双指针class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if (nums.length == 0){ return nums; } int[] res = new int[nums.length - k + 1]; int index原创 2022-01-05 17:34:12 · 330 阅读 · 0 评论 -
Day26:剑指 Offer 67. 把字符串转换成整数
题目写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如该字符串中的第一原创 2022-01-05 17:07:22 · 52 阅读 · 0 评论 -
Day26:剑指 Offer 20. 表示数值的字符串
题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。数值(按顺序)可以分成以下几个部分:若干空格一个小数或者整数(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个整数若干空格小数(按顺序)可以分成以下几个部分:(可选)一个符号字符(’+’ 或 ‘-’)下述格式之一:至少一位数字,后面跟着一个点 ‘.’至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字一个点 ‘.’ ,后面跟着至少一位数字整数(按顺序)可以分成以下几个部分:(可选)一个原创 2022-01-05 16:47:40 · 59 阅读 · 0 评论 -
Day25:剑指 Offer 31. 栈的压入、弹出序列
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。代码实现模拟class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { De原创 2022-01-05 16:25:08 · 49 阅读 · 0 评论 -
Day25:剑指 Offer 29. 顺时针打印矩阵
题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。代码实现模拟class Solution { public int[] spiralOrder(int[][] matrix) { if (matrix.length == 0){ return new int[]{}; } int m = matrix.length; int n = matrix[0].length;原创 2022-01-05 16:13:22 · 57 阅读 · 0 评论 -
Day24:剑指 Offer 62. 圆圈中最后剩下的数字
题目0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。代码实现模拟时间复杂度很高,很容易就超时class Solution { public int lastRemaining(int n, int m) { List<原创 2022-01-02 19:07:53 · 165 阅读 · 0 评论 -
Day24:剑指 Offer 57 - II. 和为s的连续正数序列
题目输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。代码实现双指针class Solution { public int[][] findContinuousSequence(int target) { List<int[]> list = new ArrayList<>(); int left = 1,right = 2;原创 2022-01-02 00:28:14 · 294 阅读 · 0 评论 -
Day24:剑指 Offer 14- I. 剪绳子
题目给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。代码实现贪心算法尽可能多的出现长度为3的段class Solution { public int cuttingRope(int n) { if(n <原创 2022-01-02 00:08:16 · 65 阅读 · 0 评论 -
Day23:剑指 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]。不能使用除法。代码实现构造乘积数组class Solution { public int[] constructArr(int[] a) { int[] b = new int[a.length]; if (a.length原创 2022-01-01 23:48:23 · 116 阅读 · 0 评论 -
Day23:剑指 Offer 39. 数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。代码实现摩尔投票法概念理解:核心就是对拼消耗。玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。那就大混战呗,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要你们不要内斗,最后肯定你赢。最后能剩下的必定是自原创 2022-01-01 21:10:53 · 3198 阅读 · 0 评论 -
Day22:剑指 Offer 56 - I. 数组中数字出现的次数
题目一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。代码实现位运算狂神01笔记中有原题class Solution { public int[] singleNumbers(int[] nums) { int xor = 0; //循环结束时xor表示出现1次的两个数的异或 for (int n:nums) { xor原创 2021-12-28 01:47:37 · 432 阅读 · 0 评论 -
Day21:剑指 Offer 65. 不用加减乘除做加法
题目写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。代码实现class Solution { public int add(int a, int b) { /** * a+b可以看成是a^b加上(a & b)<<1的结果 * 但是因为不能使用加法,所以需要不停让(a & b)<<1变小,最后变为0, * 因为(a & b)<原创 2021-12-28 01:35:24 · 373 阅读 · 0 评论 -
Day21:剑指 Offer 15. 二进制中1的个数
题目编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量)。代码实现位运算如果低位很多0,效率会很低public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int res = 0; int temp; while (n原创 2021-12-28 01:20:16 · 212 阅读 · 0 评论 -
Day20:剑指 Offer 33. 二叉搜索树的后序遍历序列
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。代码实现分治算法class Solution { public boolean verifyPostorder(int[] postorder) { if (postorder == null || postorder.length == 1){ return true; }原创 2021-12-28 01:06:23 · 194 阅读 · 0 评论 -
Day20:剑指 Offer 16. 数值的整数次方
题目实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。代码实现class Solution { public double myPow(double x, int n) { if (n == 0){ return 1;qasszcdx if (n < 0){ return 1/x * myPow(1/x,-n-1); }原创 2021-12-27 00:21:11 · 106 阅读 · 0 评论 -
Day20:剑指 Offer 07. 重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。代码实现分治算法/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { t原创 2021-12-26 16:16:30 · 134 阅读 · 0 评论 -
Day19:剑指 Offer 68 - II. 二叉树的最近公共祖先
题目给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”代码实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode r原创 2021-12-25 19:23:32 · 75 阅读 · 0 评论 -
Day19:剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
题目给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”代码实现回溯法该解法适用于所有的二叉树,因为忘了考虑二叉搜索树的性质/** * Definition for a binary tree node. * public class TreeNode { * int val; *原创 2021-12-25 19:13:08 · 65 阅读 · 0 评论 -
Day19:剑指 Offer 64. 求1+2+…+n
题目求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。代码实现class Solution { public int sumNums(int n) { //利用短路与来声明递归结束条件 boolean x = n > 1 && ( n += sumNums(n-1) )> 0; return n; }}...原创 2021-12-25 18:56:47 · 146 阅读 · 0 评论 -
Day18:剑指 Offer 55 - II. 平衡二叉树
题目输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。代码实现深度优先回溯DFS(自低至顶)/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; }原创 2021-12-25 18:49:30 · 66 阅读 · 0 评论 -
Day18:剑指 Offer 55 - I. 二叉树的深度
题目输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。代码实现使用队列层次遍历BFS/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * }原创 2021-12-25 16:34:53 · 191 阅读 · 0 评论 -
Day17:剑指 Offer 41. 数据流中的中位数
题目如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。代码实现大根堆+小根堆 /** * 维护一个大根堆,一个小根堆 * 大根堆的size大于等于小根堆 * 奇数的时候返回大根堆的头,偶数时返回(大根堆的头+小根堆的头)/ 2 */ class MedianFinder { PriorityQueue原创 2021-12-25 16:12:49 · 477 阅读 · 0 评论 -
Day17:剑指 Offer 40. 最小的k个数
题目输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。代码实现快排class Solution { public int[] getLeastNumbers(int[] arr, int k) { if(k >= arr.length){ return arr; } quickSort(arr,0,arr.length-1);原创 2021-12-25 15:40:21 · 165 阅读 · 0 评论 -
Day16:剑指 Offer 61. 扑克牌中的顺子
题目从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。代码实现基于快排的解法class Solution { public boolean isStraight(int[] nums) { quickSort(nums,0,nums.length-1); //n表示当前有多少张任意牌 int n = 0原创 2021-12-24 23:13:49 · 696 阅读 · 0 评论 -
Day16:剑指 Offer 45. 把数组排成最小的数
题目输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。代码实现思路参考K神class Solution { public String minNumber(int[] nums) { int len = nums.length; //把整型数组转化成字符串数组 String[] str = new String[len]; for (int i = 0; i < str.leng原创 2021-12-24 22:13:31 · 63 阅读 · 0 评论 -
Day15:剑指 Offer 54. 二叉搜索树的第k大节点
题目给定一棵二叉搜索树,请找出其中第 k 大的节点的值。代码实现中序遍历变形/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { int k; public原创 2021-12-21 16:25:27 · 398 阅读 · 0 评论 -
Day15:剑指 Offer 36. 二叉搜索树与双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。代码实现搜索回溯可以理解为中序遍历的变形,先处理左子树的情况,再处理当前节点,最后处理右子树因为二叉搜索树的中序遍历为递增序列。/*// Definition for a Node.class Node { public int val; public Node left; public Node right; public Node()原创 2021-12-21 16:06:43 · 353 阅读 · 0 评论 -
Day15:剑指 Offer 34. 二叉树中和为某一值的路径
题目给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。代码实现搜索回溯法/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * T原创 2021-12-21 15:20:29 · 47 阅读 · 0 评论 -
Day14:剑指 Offer 13. 机器人的运动范围
题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?代码实现搜索回溯法class Solution { int res; pub原创 2021-12-20 15:54:04 · 61 阅读 · 0 评论