![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数学与建模
数学
爱抖腿的嘻嘻嘻
这个作者很懒,什么都没留下…
展开
-
阶乘后的零
求阶乘后一个数的最后有几个零,单算阶乘很好算,算一个树后面有几个零就看它能不能被10整除,也就是%10==0,可以判断有几个零。但这样复杂度太高,需要用O(logn)的时间复杂度。算阶乘末尾有0代表它乘了个10,可以由2乘5得到,那么算阶乘中有多少对2*5因子就可以得到有多少个0,所以看n!中有多少个有5的因子,有多少个有2 的 因子就行,5的数量肯定少于2,所以按5来。但每个数不一定就是加1,比如25,有两个5的因子,所以要算每个数有几个5的因子,除以5可整除则可加1.还可以发现算5的倍数就可以,所原创 2021-01-17 12:59:49 · 233 阅读 · 0 评论 -
字符串相乘(大数相乘)
用两个指针在字符串上移动来模拟竖式乘法首先一个字符串的最低位乘另一个字符串的最低位,然后另一个字符串的指针移动,乘后得到另一个数字,如果一个数字的指针是i,另一个数字为j,则他们相加得到的res的位数是i+j和i+j+1这两位真的比其他简单好多。class Solution { public String multiply(String num1, String num2) { if(num1.equals("0") || num2.equals("0"))return "0"原创 2021-01-17 10:55:49 · 226 阅读 · 0 评论 -
不转换成字符串求一个数是否为回文数
将一个数完全反转后再比较可能会溢出,所以其实只要把后半部分反转即可,很容易得到数字后面的数字,怎么判断转换一半了,当原始数字小于反转数时就说明转换一半了。但要注意的是可能是奇数位数的数字,所以判断的时候判断revx 和rev/10x。需要在开始判断特殊情况,如果x为0则返回true,如果x<0或者最后一位为0则返回falseclass Solution { public boolean isPalindrome(int x) { if(x==0) return true;原创 2021-01-17 09:59:16 · 212 阅读 · 1 评论 -
字符串转换为整数
首先变成字符数组,然后循环去掉空格(利用index++来控制),然后判断第一个字符是不是+或者是-,是负的话设置符号位为-1准备最后乘。然后进入while循环,如果不是数字,退出。如果此时的res大于除以10的最大值或者等于但加上后大于则返回最大值,小于最小值则返回最小值。最后一步加上res。public class Solution { public int myAtoi(String str) { int len = str.length(); char[]原创 2021-01-17 09:34:49 · 101 阅读 · 0 评论 -
求整数反转值
从最低位开始,并把它加到rev上,加的时候要把原来的rev乘10再加,这样就可以实现最后的最低位变到最高位。但是要注意的是加后这个可能溢出,所以加之前要检查rev/10是否超过范围。class Solution { public int reverse(int x) { int res=0; while(x!=0){ int t=x%10; x=x/10; if(res>Integer.原创 2021-01-17 09:18:30 · 108 阅读 · 0 评论 -
打印从1到最大的n位数
首先这是一个没有限制n大小的题,所以不能拿普通的数字输出,是一个大数问题,要把字符输出转换为字符串输出。两种思路第一种是字符串(用char类型的数组比较好改)为n位(不和C++一样用/0标志结束,对象中可以直接用length来查看是否结束),然后前面空的为0,每次加1,输出。直到加1后溢出则不再加1,退出循环。//打印1到最大的n位数public void printToMaxOfDigits(int n){ if(n <= 0){ System.out.println("输入的n没有意原创 2020-11-15 20:08:59 · 95 阅读 · 0 评论 -
实现pow函数
数值的整数次方(1)完整性考虑不用考虑大数问题,就任意一个double数base的整数次方ex这里就要完整的考虑问题,整数包括正数,负数,0.首先如果base是0,那么它的任何次方都返回0如果ex是0,那就直接返回1.如果ex是负数,则定义一个flag来使求出来的数求倒(2)求次方的效率解法因为和上上上个算法一样,一个数的正数次方可以被分解ex为奇数 pow(base,ex)=pow(base,ex/2)pow(base,ex/2)偶数 pow(base,ex)=pow(base,e原创 2020-11-14 11:30:38 · 1345 阅读 · 0 评论 -
1到n中1出现的次数
输入整数n,求1到n这n个整数的十进制中1出现的次数。暴力解累加每个数1出现的次数,一个数1出现的次数就是判断每一位是否是1,先通过&1找到个位是否为1,然后,除以10可以得到每一位。这样就需要遍历每个数字的每一位,一个数字有O(logn)位,所以需要判断O(nlogn)。找规律不遍历每一位,就是找1出现的规律。分别计算每一位上1可能出现的次数,循环n的位数次就可以计算出共有多少个1.算一位上可能出现的次数要将它分为三类,就是这一位为1,为0或者大于1这三种情况可能对1出现次数有影原创 2020-12-04 10:52:15 · 210 阅读 · 0 评论 -
数字序列中某一位的数字
有一个字符数组为0123一直往后排,求第n位的数字暴力解就是循环所有的数字,每循环一个就把它的位数累加,等什么时候超过了n,就说明第n位一定在这个数字中,再具体找到哪一位。找规律如果用f(m)表示从开始到位数为m的最大数字的位数之和则f(0)=0f(1)=101f(2)=f(1)+902f(3)=9003+f(2)f(4)=90004+f(3)f(m)=9*10^(m-1)*m+f(m-1)所以找到n在哪个区间之后,就可以根据m得到几位数,然后用n-f(m)得到有几个个位数,再用这个除以原创 2020-12-04 19:01:31 · 85 阅读 · 0 评论 -
丑数
求出第n个丑数丑数的意义就是因子只有2,3,5,也就是一个丑数必定是由另一个丑数乘2,3,5得到的,然后他要求第n个,那就从第1个开始求,一直求到第n个即可解决,那怎么求呢,规定第一个是1,那后面的就是1乘2,3,5,每一个丑数都可以得到3个新的丑数,所以要按顺序来选一个最小的丑数,因为每个数都要乘3次得到3个新丑数,所以设置3个指针。分别标志这个数的这3次乘乘到哪了,用一个n次的循环来每次找一个丑数,如果找的是对应数的哪次乘,将这个指针后移,说明该下个数乘它了其实是一个动态规划,从小开始从前面的数求原创 2020-12-07 22:29:08 · 115 阅读 · 0 评论 -
n个骰子的点数
求n个骰子朝上一面的点数和s求s所有值出现的概率n个骰子的最大值为6n,最小值为n,n个骰子排列组合为6^n,统计每个点数的次数,然后除以6的n次方才能得到概率如果递归来思考,把骰子分成两堆,一堆为1个,另一堆为n-1个,所以计算这个骰子分别出现1到6再加上f(n-1)的和s。定义一个长度为6n-n+1的数组来保存和s的次数,然后递归遍历每一个和s,出现则加上。最后循环数组算出概率。递归求和的过程是每一个和s都是由所有n个骰子相加得到的,一开始和s等于的是第一个单独的骰子的点数,然后加上下一个骰子原创 2020-12-15 11:01:46 · 148 阅读 · 0 评论