![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数学
Betternw
这个作者很懒,什么都没留下…
展开
-
用rand7实现rand10
题目描述已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。不要使用系统的 Math.random() 方法。分析得到1-40 41-49舍弃对于大于40的数,(大于40的随机数−40−1)∗7+rand7()可以得到 1-631−63 之间的随机数,只要舍弃 33 个即可,那对于这 33 个舍弃的,还可以再来一轮:(大于60的随机数−60−1)∗7+rand7()这样我们可以得到 1-211−21 之间的随机原创 2021-08-13 11:31:11 · 274 阅读 · 0 评论 -
二叉树根节点到叶子节点的所有路径和
题目描述描述给定一个仅包含数字\ 0-9 0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。例如根节点到叶子节点的一条路径是1\to 2\to 31→2→3,那么这条路径就用\ 123 123 来代替。找出根节点到叶子节点的所有路径表示的数字之和例如:这颗二叉树一共有两条路径,根节点到叶子节点的路径 1\to 21→2 用数字\ 12 12 代替根节点到叶子节点的路径 1\to 31→3 用数字\ 13 13 代替所以答案为\ 12+13=25 12+13=25示例1原创 2021-08-07 11:30:21 · 611 阅读 · 0 评论 -
进制转换。
题目给定一个十进制数 M ,以及需要转换的进制数 N 。将十进制数 M 转化为 N 进制数。当 N 大于 10 以后, 应在结果中使用大写字母表示大于 10 的一位,如 ‘A’ 表示此位为 10 , ‘B’ 表示此位为 11 。若 M 为负数,应在结果中保留负号。示例1:输入:7,2返回值:“111”分析除N取余,然后倒序排列,高位补零。代码public String solve (int M, int N) { // write code here原创 2021-08-01 16:12:07 · 115 阅读 · 0 评论 -
54 螺旋矩阵
题目描述给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]分析旋转挨个输出即可代码public List<Integer> spiralOrder(int[][] matrix) { List<Integer> res = new LinkedList<>();原创 2021-07-03 11:16:45 · 108 阅读 · 0 评论 -
7 整数反转
题目描述给出一位32位的有符号整数,将这个整数中每位上的数字进行反转。例如:输入 123 输出321 输入-123 输出-321 输入 120 输出 21假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。思路分析当不考虑溢出的时候,pop取每次x更新的值的最后一位,x不断整除10,ans用...原创 2020-03-07 10:59:36 · 130 阅读 · 0 评论 -
9回文数
题目描述难度简单957判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121 输出: true示例 2:输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。...原创 2020-03-07 18:31:54 · 254 阅读 · 0 评论 -
66 加一
题目描述给定一个由整数组成的非空数组所表示的非负整数,在该数的及出生加一。最高为你数字存放在数组的首位,数组中每个元素只存储单个数字。示例 1:输入: [1,2,3] 输出: [1,2,4] 示例 2: 输入: [4,3,2,1]输出: [4,3,2,2]思路分析循环从最后一位开始,加一,进行取余,如果加一后是需要进位取余后为0然后继续循环前一位进行加一,当当前位不是0时可以输出...原创 2020-03-08 12:04:22 · 141 阅读 · 0 评论 -
172 阶乘后的零
题目描述给定一个整数 n,返回 n! 结果尾数中零的数量。示例 1: 输入: 3 输出: 0解释: 3! = 6, 尾数中没有零。 示例 2: 输入: 5 输出: 1 解释: 5! = 120, 尾数中有 1 个零.思路分析N!有多少个后缀0,即N!有多少个后缀5.N!有多少个后缀5,即N可以划分成多少个5个数字一组,加上划分成多少个25个数字一组,加上划分多少组成1...原创 2020-03-10 10:14:26 · 224 阅读 · 0 评论 -
【类型转换 比较器】 offer 45 把数组排成最小的数
题目输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。输入: [10,2]输出: “102”思路基本类型变为字符串:——基本类型的值+“ ”(空字符串)——包装类的静态方法toString(参数) 【将对象转换为字符串】【变量.toString】——String类的静态方法valueOf(基本参数)【将对象转换为基本数据的值】【String.valueOf】字符串变为基本类型:——包装类的静态方法parseXXX(“数值类型的字符串”)pub原创 2020-07-09 16:47:50 · 68 阅读 · 0 评论 -
offer 43 1-n整数中1出现的次数
题目输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。输入:n = 12输出:5输入:n = 13输出:6分析cur=0:high×digitcur=1:high×digit+low+1cur>1:(high+1)×digithigh/cur/low/digit初始化:n/10、n%10、0、1然后进行cur位数的前移动,每次都判断当前cur的值然后根据公式计算,并将结果累加原创 2020-07-09 11:23:45 · 75 阅读 · 0 评论 -
offer17 打印从1到最大的n位数
题目输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。输入: n = 1输出: [1,2,3,4,5,6,7,8,9]代码public int[] printNumbers(int n) { int end = (int)Math.pow(10,n)-1; int []res = new int[end]; for(int i = 0;i<end;i++){ res[i] =原创 2020-07-05 18:40:54 · 96 阅读 · 0 评论 -
offer 44 数字序列中某一位的数字
思路确定在0-9/10-99/100-999.。。中哪个位置中,digit是表示几位数由该范围的起始位置和位数确定是哪个数字确定在这个数字的第几位代码 public int findNthDigit(int n) { if(n==0) return 0; int digit = 1; long start = 1; //注意类型 long count = 9; //位数数量 注意类型 while(n>cou原创 2020-07-09 15:45:01 · 88 阅读 · 0 评论 -
【快速幂】 offer 16 数值的整数次方
题目思路如果幂数为奇数,将底数分出一个幂。如果幂数为偶数,就降一半的次数,也就是(底数的平方)^一半幂数,直到慕数为0判断奇数:n&1=1取半:n>>1如果幂数是负数,将底数取分数,幂取反int最小值取反会超出最大值,因为用long类型代替int类型代码...原创 2020-07-05 18:29:33 · 88 阅读 · 0 评论 -
offer 67 把字符串转换成整数
题目写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如该字符串中的第一原创 2020-07-14 15:36:49 · 84 阅读 · 0 评论 -
offer20 表示数值的字符串
题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。代码public boolean isNumber(String s) { if(s==null || s.length()==0){ return false; } //标记此位置前是否出现下列情况原创 2020-07-05 19:44:15 · 64 阅读 · 0 评论 -
offer 61扑克牌中的顺子
题目从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。示例 1:输入: [1,2,3,4,5]输出: True示例 2:输入: [0,0,1,2,5]输出: True思路如果没有重复的牌,且最大牌减最小牌小于5时,满足要求。使用Set集合或者List集合都可以。Set集合不允许有重复数字代码 public boolean isStraight原创 2020-07-14 10:13:46 · 68 阅读 · 0 评论 -
offer 14-2剪绳
题目给你一根长度为 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)输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1思路需要取模最大的乘积是尽可能分割出尽量多的长度为3的绳子原创 2020-07-04 21:12:00 · 62 阅读 · 0 评论 -
offer66 构建乘积数组
题目给定一个数组 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,2,3,4,5]输出: [120,60,40,30,24]思路建立两个数组,分别维护当前数字左边和右边的乘积。代码 public int[] constructArr(int[] a) { if(a==null||a.length==0) return n原创 2020-07-14 14:49:10 · 77 阅读 · 0 评论 -
offer 29 顺时针打印矩阵
题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]思路定义四个边界,分别表示上下左右,然后轮圈打印,并判断边界,边界越界就结束循环。每打印一层,要记得收缩边界。代码public int[] spiralOrder(int[][] matrix) { //定义四个点 if(matrix.length==0) return new int[0];原创 2020-07-07 00:13:09 · 79 阅读 · 0 评论 -
offer05 替换空格
题目请实现一个函数,把字符串 s 中的每个空格替换成"%20"。输入:s = “We are happy.”输出:“We%20are%20happy.”思路注意:经常变换的字符串声明为StringBuilder类字符串连接用append方法最后要将StringBuilder类toString字符串基本所有方法都要加()代码public String replaceSpace(String s) { StringBuilder res = new StringBuilder();原创 2020-07-03 20:35:58 · 69 阅读 · 0 评论 -
【前等后升序,前不等前降序 list没搞懂 】 406 根据身高重建队列
题目假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]思路按照身高排序,然后按照人数对应的索引,将每个数组插入到对应人数的位置上。图解代码public int[][] reconstructQ原创 2020-06-29 11:42:04 · 114 阅读 · 0 评论 -
297 二叉树的序列和反序列化【前序实现】
题目设计一个算法实现二叉树的序列化和反序列化分析序列化:当前节点为null时候,返回“#”。当前节点为数字时,字符串累加数字+“!”。最后返回的字符串结果就是1!2!##3!#反序列化:创建数组,使用!分割符号。然后将数组的值放入队列。队列的值弹出,先弹出头结点,如果是#则返回null,然后使用递归弹出head.left和head.right。(因为是递归,所以不用考虑循环问题。写一次的代码就思考一次的情况即可。)代码public static class TreeNode { publ原创 2020-06-08 21:31:00 · 120 阅读 · 0 评论 -
【快速排序 双指针】 283 移动零
题目给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。输入: [0,1,0,3,12]输出: [1,3,12,0,0]分析数字根据大小进行区域的划分——想到快速排序。双指针,j指向不等于0的区域,i进行遍历,遇到不等于0的就交换到j的区域中。最后左边都是不等于0的数字。右边是0。代码public void moveZeroes(int[] nums) { if(nums==null){ return; } i原创 2020-06-10 12:38:34 · 133 阅读 · 0 评论 -
【二分】 240 搜索二维矩阵
题目编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列思路从右上角开始搜索,如果当前值比目标值大,就向左走,如果当前值比目标值小,就向下走代码public boolean searchMatrix(int[][] matrix, int target) { if(matrix==null|| matrix.length < 1 || matrix[0].length &l原创 2020-07-02 14:45:37 · 115 阅读 · 0 评论 -
【动态规划 左右划分】 238 除自身以外数组的乘积
题目给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。输入: [1,2,3,4]输出: [24,12,8,6]思路建立两个数组,分别表示当前数字左边的乘积和右边的乘积。最终当前数的乘积是当前索引下左边和右边的乘积。代码public int[] productExceptSelf(int[] nums) { int []l = new int[nums.l原创 2020-06-30 15:13:25 · 114 阅读 · 0 评论 -
169多数元素
题目描述给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1: 输入: [3,2,3] 输出: 3 示例 2: 输入: [2,2,1,1,1,2,2] 输出: 2思路分析【排序】先排序,由于重复数字超过一半则一半位置的数字一定是要求的数字。代码实现...原创 2020-03-09 20:59:53 · 162 阅读 · 0 评论 -
【连乘当前数的最大值和最小值,记录比较并交换】 152乘积最大子数组
题目给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。思路首先必须是连续的子数组。因为数组中存在负数,当乘负数的时候,累乘的最大值就变成了最小值。因此定义一个最小值,当遇到负数的时候,交换最大值最小值。代码public int maxP原创 2020-06-24 11:55:47 · 288 阅读 · 0 评论 -
【公式 G(n) = G(i-1)G(n-i)】 96不同的二叉搜索树
题目给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树:1 3 3 2 1\ / / / \ 3 2 1 1 3 2/ / \ 2 1 2 3思路当i原创 2020-07-20 17:13:07 · 107 阅读 · 0 评论 -
【数组元素的列表 排序 逐个判断 注意toArray类型转换】56 合并区间
题目给出一个区间的集合,请合并所有重叠的区间。输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].输入: [[1,4],[4,5]]输出: [[1,5]]解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。分析将数组元素按照左边界进行排序。将第一个数组加入到结果集中,如果下一个数组的左边界的值小于前一个数组的右边界的值,就更新右边界。代码p原创 2020-06-21 15:47:51 · 230 阅读 · 0 评论 -
【for循环 每个位置能到达的最远位置】 55 跳跃游戏
题目给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。输入: [2,3,1,1,4]输出: true输入: [3,2,1,0,4]输出: false思路如果能从某个点跳到中点,那么从左边任何一个点出发都可以跳到终点。因为可以每次只跳一步。因此此题转换为寻找是否有一个点可以直接跳到终点。无法到达的判断条件:当数组长度大于可以到达的最远距离时。代码public boolean canJump(int[] n原创 2020-06-21 15:00:54 · 201 阅读 · 0 评论 -
【48】 旋转图像
题目给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。给定 matrix =[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]原创 2020-06-20 22:24:43 · 74 阅读 · 0 评论 -
【寻找逆序对 i j k 】31 下一个排列
题目难度中等528实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1思路字典排序的原理:下一个排列意味着,下一个数比当前的数更大,因此要将后面的大数与前面的小数交换,比如123456更大的数字是123465.希望下一个数增加的幅度尽可能的小。因此在尽可能靠右的低位进行交换,越靠前交换最后整个数字越大,因此从原创 2020-06-20 19:37:23 · 121 阅读 · 0 评论 -
【记录进位值】2两数相加
题目给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807分析每一位的计算需要考虑上一位的进位问题,当前位计算完后也要更新进位值。如果两个链表全部遍历完毕,进位值为1,那么要添加节点1 。原创 2020-06-09 11:04:28 · 291 阅读 · 0 评论