leetcode29——两数相乘
2021/11/11 23:14:36
本文主要是介绍leetcode29——两数相乘,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
大佬解法:
力扣
关于int类型和long类型
区别1 16位系统:long是4字节,int是2字节 32位系统:long是4字节,int是4字节 64位系统:long是8字节,int是4字节
区别2 long和int的区别就是他们的占位长度不同 其中long是64位、而int是32位————010101011这样的
区别3 int: 32位整数 -2,147,483,648——2,147,483,647,一般来说整数都够用了————10位 long: 64位整数 -9,223,372,036,854,775,808—— 9,223,372,036,854,775,807,一般不需要用————19位
关于Integer.MIN_VALUE和Integer.MAX_VALUE
2147483647 -2147483648
本题我只会暴力解法,而且对于越界的还没处理好
首先有四个排除性
当被除数 为0 时,直接返回0
当被除数与除数相等时,返回1
当除数为1,被除数如果超过最大值 则返回最大值 否则返回被除数
当除数为-1时,被除数如果小于最小值 则返回最小值 否则返回被除数*-1
涉及到一个int转long
因为比较好的方法 是通过改变步长来求,何为改变步长
在暴力解法中,我是直接不断使被除数减除数 直到 不能再减为止
这样每次的步长都是固定的,但不妨大胆点 如果被除数很大,除数很小,那么步长也可以大些
所以就有
public int div(long a,long b){ if(a<b) return 0; int count=1; //统计被除次数 long tem=b; while((tem+tem)<=a){ count=count+count; //因为条件是两个tem 所以次数也是两倍 tem=tem+tem; //再后面进入循环中 依旧两倍走下去 }//上述循环可以达到每次都算2倍2倍 以指数级别增长 return count+div(a-tem,b);//这里的话 第一次循环求出最大count,剩下就缩小被除数 看对原始b能除几次 }
那么本题为什么要修改int转long呢?因为有的值可能接近最大值或最小值
如果tem一直增长到十位数时 如:1,147,483,647
那么在循环体中1,147,483,647+1,147,483,647 就超过最大值了 这是tem又变为
然后接着再次循环就会变为0
这样就进入了死循环。
完整代码
class Solution { public int divide(int dividend, int divisor) { //先排除特例值 if(dividend==0) return 0; if(dividend == divisor) return 1; if(divisor == -1){ if(dividend>Integer.MIN_VALUE) return -dividend; return Integer.MAX_VALUE; } if(divisor == 1){ if(dividend<Integer.MAX_VALUE) return dividend; return Integer.MAX_VALUE; } long diva=(long)dividend; long divb=(long)divisor; //判断正负 int sign=1; if( (diva<0 && divb >0) || ( diva>0 && divb <0 ) ){ sign=-1; } //long 类型和int 类型差异需补一下 //判断正负之后统一为正数 diva=diva>0?diva:-diva; divb=divb>0?divb:-divb; //核心部分 int res=div(diva,divb); res=res>Integer.MAX_VALUE?Integer.MAX_VALUE:res; //还原正负 res=(sign>0)?res:-res; return (int)res; } public int div(long a,long b){//这里是int的时候不行 只有long才行 为啥? //if(a==b) return 1; if(a<b) return 0; int count=1; long tem=b; while((tem+tem)<=a){ count=count+count; tem=tem+tem; } return count+div(a-tem,b); } }
这篇关于leetcode29——两数相乘的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享