大麦网建设网站的功能定位,重庆seo整站优化外包服务,哪里不好就去建设,怎样才能做自己的网站数字与数学基础问题
1、数字统计
1.1、符号统计
LeetCode1822. 给定一个数组#xff0c;求所有元素的乘积的符号#xff0c;如果最终答案是负的返回-1#xff0c;如果最终答案是正的返回1#xff0c;如果答案是0返回0.
这题其实只用看数组中0和负数的个数就好了#x…数字与数学基础问题
1、数字统计
1.1、符号统计
LeetCode1822. 给定一个数组求所有元素的乘积的符号如果最终答案是负的返回-1如果最终答案是正的返回1如果答案是0返回0.
这题其实只用看数组中0和负数的个数就好了数组中有0的话最后的结果肯定是0数组中负数的个数是奇数的话最终结果就是负的偶数个的话结果就是正的。代码如下
public int arraySign(int[] nums) {int prod 1;for (int i 0; i nums.length; i) {if (nums[i] 0) {return 0;} else if (nums[i] 0) {//直接交替就好了很好的处理技巧prod -prod;}}return prod;
}1.2、阶乘结果中末尾0的个数
设计一个算法算出n阶乘后有多少个尾随0。
这题如果硬算的话肯定会花费很多时间我们可以换个角度思考如果一个数的末尾有0肯定是乘过10的而10是由 2 * 5得来的所以只用统计2和5一起出现多少对不过因为2出现的次数一定大于5出现的次数因此我们只需要统计5出现的次数就好了。在统计的过程中我们只需要统计5、10、15、…… 5 n 5^n 5n这样5的整数倍就好了最后累加起来就是多少个0。代码如下
public int trailingZeroes(int n) {int cnt 0;for (long num 5; n / num 0; num * 5) {cnt n / num;}return cnt;
}这里num * 5 是因为 n / num 首先计算的是从1到n数中包含1个5的个数比如1 * 5 52 * 5 10然后计算的是包含2个5的个数比如5 * 5 255 * 5 * 2 50以此类推加起来就是最终结果中含5的个数。
2、溢出问题
2.1、整数反转
LeetCode7. 给你一个32位的有符号整数x返回将x中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围[-2^31 , 2^31 - 1]就返回0.假设环境不允许存储64位整数有符号或无符号。
这题需要考虑溢出的问题比如1147483649这个数字它是小于最大的32位整数2147483647的但是将这个数字反转过来后就变成了9463847411这就比最大的32位整数还要大了这样的数字是没法存到int中的所以就溢出了。
取得一个数中的各个位上的数字很简单循环取模即可例如取得12345的各个数位上的数字首先将12345 % 10 5就得到个位数上的数字5然后将12345 / 10 1234这样再继续模10就好了如下图所示 这是正数的情况如果再考虑负数的话可以将循环设置为while(x ! 0)。因为无论是正数还是负数按照上面不断的/10操作最后都会变为0所以判断终止条件就是 ! 0。
再就是怎么去处理溢出的问题我们需要从倒数第二位开始判断是否溢出因为如果直接比较最终的结果的话像上面所讲到的一旦数溢出的话int是存不下的所以得提前判断。而32位最大整数MAX2147483647它的倒数第二位是4所以就要分析结果的倒数第二位和4的大小关系如下所示 如果res 214748364那最后一位要接上的数就不用看了肯定溢出了如果res 214748364就需要跟最大数的最后一个数字相比如果比7大那就说明溢出了如果res 214748364继续处理即可不会溢出
对于负数同理代码如下
public int reverse(int x) {int res 0;while(x ! 0) {//获得末尾数字int temp x % 10;//判断是否大于最大的32位整数if (res Integer.MAX / 10 || (res Integer.MAX / 10 temp 7)) {return 0;}//判断是否小于最小的32位整数if (res Integer.MIN / 10 || (res Integer.MIN / 10 temp -8)) {return 0;}res res * 10 temp;x / 10;}return res;
}3、进制专题
3.1、进制转换
给定一个十进制数M以及需要转换的进制数N将十进制数M转化位N进制数。M是32位整数2N16.
对于这个问题需要处理以下的几个点
超过进制最大范围后需要映射到其他进制比如用ABCDEF去表示数需要对结果进行转置需要判断符号
用以下三个措施可以比较方便的去处理这个问题
定义大小位16的数组F保存的是2到16的各个进制的值对应的标记这样赋值时只计算下标不必考虑不同进制的转换关系使用StringBuffer完成数组转置等功能通过一个flag来判断正数还是负数
//要考虑到余数9的情况2 N 16
public static final String[] F {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F};//将十进制数M转化位N进制数
public String convert(int M, int N) {if (M 0) {flag true;M * -1;}StringBuffer sb new StringBuffer();int temp;while(M ! 0){temp M % N;sb.append(F[temp]);M M / N;}sb.reverse();return (flag ? - : ) sb.toString();
}