当前位置: 首页 > 后端技术 > Java

LeetCode-029-双数除法

时间:2023-04-01 23:59:51 Java

双数除法题目描述:给定两个整数,被除数divisor和被除数divisor。两个数相除,不需要乘法、除法和模运算符。返回股息除以除数divisor得到的商。整数除法的结果应该截断(truncate)它的小数部分,例如:truncate(8.345)=8andtruncate(-2.7335)=-2例如,请参考LeetCode官网。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode所有。商业转载请联系官方授权,非商业转载请注明出处。方案一:二分查找首先判断几种特殊情况;然后使用二进制搜索方法找到除数。解法参考leetcode官网的解法。publicclassLeetCode_029{/***二分查找**@paramdividenddivisor*@paramdivisordivisor*@return*/publicstaticintdivide(intdividend,intdivisor){if(dividend==Integer.MIN_VALUE){if(divisor==1){//当被除数为最小值且除数为1时,直接返回最小值returnInteger.MIN_VALUE;}if(divisor==-1){//当被除数为最小值时,除数为-1}}if(dividend==0){//如果被除数为0,则被除数为0任意数,返回0直接返回0;}if(divisor==Integer.MIN_VALUE){if(dividend==Integer.MIN_VALUE){//如果被除数和除数都是最小值,则返回1return1;}else{//当除数为最小值时,被除数不是最小值,除法结果必须在-1和1之间,return0return0;}}//反转所有正数,因此只需要考虑一种情况booleanrev=false;如果(股息>0){股息=-股息;转速=!转速;}if(divisor>0){divisor=-divisor;转速=!转速;}intleft=1,right=Integer.MAX_VALUE,ans=0;while(left<=right){//注意溢出,不能使用除法intmid=left+((right-left)>>1);booleancheck=quickAdd(除数,中间,股息);如果(检查){ans=mid;//注意溢出if(mid==Integer.MAX_VALUE){break;}左=中+1;}else{右=中-1;}}返回转速?-ans:答案;}/***快速乘法**@paramy*@paramz*@paramx*@return*/publicstaticbooleanquickAdd(inty,intz,intx){//x和y是负数,z为正//需要判断z*y>=x是否成立intresult=0,add=y;而(z!=0){if((z&1)!=0){//需要保证result+add>=xif(result=xif(add>=1;}返回真;}publicstaticvoidmain(String[]args){System.out.println(Integer.toBinaryString(10));System.out.println(Integer.toBinaryString(6));System.out.println(Integer.toBinaryString(3));System.out.println(除法(10,3));}}【每日留言】以平静的容颜,历经烟雨尘风的侵袭,还原最初的自己,相拥欢笑,静坐时光深处。

最新推荐
猜你喜欢