算法通关村第十三关—数学与数学基础问题(青铜)

2023-12-12 20:28

本文主要是介绍算法通关村第十三关—数学与数学基础问题(青铜),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      数学与数学基础问题

一、统计专题

1.1 符号统计

 LeetCode1822给定一个数组,求所有元素的乘积的符号,如果最终答案是负的返回-1,如果最终答案是正的返回1,如果答案是0返回0。
 题目比较简单,正数对结果完全没影响,只需判断有多少个负数和是否有0即可

class Solution {public int arraySign(int[] nums) {int judge = 1;for(int num: nums){if(num == 0) return 0;if(num < 0) judge *= -1;}return judge == 1 ? 1 : -1;}
}

1.2 阶乘0的个数

 Leetcode 172 给定一个整数n,返回 n!结果中尾随零的数量。
 这道题需要统计尾数有多少个0,那其实可以想成有多少对5和2,而5的数量是一定是少于2的,所以统计出5的个数即可得出结果

class Solution {public int trailingZeroes(int n) {int sum = 0;//求出所有5的倍数for(int i = 5; i <= n; i += 5){//这些数可以拆出多少个5for(int k = i; k % 5 == 0; k /= 5) sum++;}return sum;}
}

 当然,这道题还可以进行优化,例如:当某个数x是5的倍数时,当5^1 <= x < 5^2 时,它只含有一个5,像5,10,15,20;而当5^2 <= x< 5^3 时它包含两个5。所以,我们可以利用上述例子来计算0的个数。sum = n/5+n/(5^2)+…

lass Solution {public int trailingZeroes(int n) {int sum = 0;for(int i = 5; n / i > 0; i *= 5){sum += n / i;}return sum;}
}

二、溢出问题

2.1 整数反转

 LeetCode7 给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围[-231,231一1],就返回0。假设环境不允许存储64位整数(有符号或无符号)
image.png
 这道题要解决两个关键问题:1.如何进行整数反转;2.如何判断溢出
 对于整数反转,只需要创建另外一个变量rev来反转即可,不需要复杂的数据结构

例:123
123 % 10 = 3, 123 / 10 = 12 
rev = 0 * 10 + 3 = 312 % 10 = 2, 12 / 10 = 1
rev = 3 * 10 + 2 = 321 % 10 = 1, 1 / 10 = 0
rev = 32 * 10 + 1 = 321

 对于溢出问题,当int溢出时,会无法得到你正常运算结果的数,这里有两种解决方法。一种是讲义中对溢出的前一位就进行判断,另外一种我是用long类型变量来保存反转结果,这样可以在反转完一次性判断是否溢出。两种写法代码如下:

//第一种 讲义
class Solution {public int reverse(int x) {int rev = 0;while(x != 0){int max = Integer.MAX_VALUE;int min = Integer.MIN_VALUE;if(rev > max / 10 || (rev == max / 10 && x % 10 > max % 10)) return 0;if(rev < min / 10 || (rev == min / 10 && x % 10 < min % 10)) return 0;rev = rev * 10 + x % 10;x /= 10;}return rev;}
}
//第二种 自己发现的,时间复杂度也是击败100%
class Solution {public int reverse(int x) {long rev = 0;while(x != 0){rev = rev * 10 + x % 10;x /= 10;}if(rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE) return 0;return (int)rev;}
}

2.2 字符串转整数

Leetcode 8 :在字符串一关中

2.3 回文数

 LeetCode9 给你一个整数x,如果x是一个回文整数,返回true;否则,返回false
 根据题目要求,我们可以对整数x进行反转后与原数进行比较,若相等则为回文数,但这样要考虑溢出问题。所以,可以考虑反转一半的数,然后前后两部分进行比较。(注意考虑整数位数的奇偶)
代码如下:

public boolean isPalindrome(int x){
//特殊情况:
//如上所述,当x<0时,x不是回文数。
//同样地,如果数字的最后一位是0,为了使该数字为回文,
//则其第一位数字也应该是0
//只有0满足这一属性
if(x < 0 || (x % 10 = 0 && × != 0)) return false;
int revertedNumber 0;
while (x > revertedNumber){
revertedNumber = revertedNumber 10 + x % 10;
x /= 10;
}
//当数字长度为奇数时,我们可以通过revertedNumber/10去除处于中位的数字。
//例如,当输入为12321时,在while循环的末尾我们可以得到x=12,revertedNumber=123
//由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
return x == revertedNumber || x == revertedNumber / 10;
}

巧妙地化字符串,利用reverse()方法求解

class Solution {public boolean isPalindrome(int x) {String reversedStr = (new StringBuilder(x + "")).reverse().toString();return (x + "").equals(reversedStr);}
}

三、进制专题

3.1 七进制数

 LeetCode504.给定一个整数num,将其转化为7进制,并以字符串形式输出。其中-107<=num<=107。
 给定一个整数将其转换成7进制的主要过程是循环取余和整除,最后将所有的余数反过来即可。例如,将十进制数101转成七进制:

示例:101
101÷7=143
14÷7=20
2÷7=02
结果:203

注意如果是负数,要先把负号取出来再计算。

class Solution {public String convertToBase7(int num) {StringBuffer str = new StringBuffer();if(num == 0) return "0";int judge = 1;if(num < 0){judge = -1;num = -1 * num;}while(num != 0){str.append("" + num % 7);num /= 7;}if(judge == -1) str.append("-");return str.reverse().toString();}
}

3.2 进制转换

 给定一个十进制数M,以及需要转换的进制数N,将十进制数M转化为N进制数。M是32位整数,2<=N<=16。
 这个题目的思路不复杂,但是想写正确却很不容易,本题有好几个需要处理的问题:
1.超过进制最大范围之后如何准确映射到其他进制,特别是ABCDEF这种情况。简单的方式是大量采用if判断,但是这样写代码太多了
2.需要对结果进行一次转置。
3.需要判断负号。
 下面这个是讲义总结出的最精简,最容易理解的实现方案。注意采取三个措施来方便处理:
1.定义大小为16的数组F,保存的是2到16的各个进制的值对应的标记,这样赋值时只计算下标,不必考虑不同进制的转换关系了。(绝妙)
2.使用StringBuffer的reverse()完成数组转置等功能,如果不记得这个方法,工作量直接飙升。
3.通过一个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){Boolean flag = false;if(M < 0){flag = true;M *= -1;}StringBuffer sb = new StringBuffer();int temp;while(M != 0){temp = M % N;//技巧一:通过数组F[]解决了大量繁琐的不同进制之间映射的问题sb.append(F[temp]);M = M / N;}//技巧二:使用StringBuffer的reverse()方法,让原本麻烦的转置瞬间美好sb.reverse();//技巧三:最后处理正负,不要从一开始就揉在一起。return (flag ? "-" : "") + sb.toString();
}

这篇关于算法通关村第十三关—数学与数学基础问题(青铜)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/485821

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模