博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode: 29. Divide Two Integers (Medium)
阅读量:6713 次
发布时间:2019-06-25

本文共 2241 字,大约阅读时间需要 7 分钟。

1. 原题链接

2. 题目要求

给出被除数dividend和除数divisor,求出二者相除的商,余数忽略不计。

注意:不能使用乘法、除法和取余运算

3. 解题思路

陷阱一:MIN_VALUE/-1会溢出。因为Integer.MIN_VALUE = -的绝对值比Integer.MAX_VALUE大1

陷阱二:除数divisor不能等于“0”


 

思路一:使用一个while循环,当dividend >= divisor时,进入循环。dividend = divident - divisor,每减一次计数器res+1。循环结束后则得到二者之商。

缺点:时间复杂度为O( n ),当被除数很大、除数很小时,效率非常低

3 public class DivideTwoIntegers29 { 4     public static void main(String[] args) { 5         System.out.println(divided(-36, -3)); 6     } 7  8     public static int divide(int dividend, int divisor) { 9         if (divisor == 0 || dividend == Integer.MIN_VALUE && divisor == -1)10             return Integer.MAX_VALUE;11         int res = 0;12         int sign = (dividend < 0) ^ (divisor < 0) ? -1 : 1; // 异或运算,除数和被除数同号为正,异号为负13         long dvd = Math.abs((long) dividend);14         long dvs = Math.abs((long) divisor);15         while (dvd >= dvs) {16             dvd -= dvs;17             res++;18         }19         return sign == 1 ? res : -res;20     }21 }

 


 

思路二:采用位移运算,任何一个整数可以表示成以2的幂为底的一组基的线性组合,即num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n。基于以上这个公式以及左移一位相当于乘以2,我们先让除数左移直到大于被除数之前得到一个最大的基。然后接下来我们每次尝试减去这个基,如果可以则结果增加加2^k,然后基继续右移迭代,直到基为0为止。因为这个方法的迭代次数是按2的幂直到超过结果,所以时间复杂度为O(logn)

1 public class DivideTwoIntegers29 { 2     public static void main(String[] args) { 3         System.out.println(divided(-36, -3)); 4     } 5  6     public static int divide(int dividend, int divisor) { 7         if (divisor == 0 || dividend == Integer.MIN_VALUE && divisor == -1) 8             return Integer.MAX_VALUE; 9         int res = 0;10         int sign = (dividend < 0) ^ (divisor < 0) ? -1 : 1; // 异或运算,除数和被除数同号为正,异号为负11         long dvd = Math.abs((long) dividend);12         long dvs = Math.abs((long) divisor);13         while (dvs <= dvd) {14             long temp = dvs, mul = 1;15             while (dvd >= temp << 1) {  // temp<<1,二进制表示左移一位,等价于temp乘以216                 temp = temp << 1;17                 mul = mul << 1;18                 System.out.println("temp = " + temp + "  " + "mul = " + mul);19             }20             dvd -= temp;21             System.out.println("dvd" + dvd);22             res += mul;23         }24         return sign == 1 ? res : -res;25     }26 }

 

转载于:https://www.cnblogs.com/huiAlex/p/8183231.html

你可能感兴趣的文章
产品优化利器
查看>>
js,query 选择radio+选中select+checkbox选中
查看>>
FreeBSD小技巧
查看>>
kolla简介
查看>>
php入门教程: php中字符的使用和操作
查看>>
php变量2
查看>>
Spring aop 异常统一处理
查看>>
【JS进阶2】attachEvent()/addEventListener() 对象添加触发事件
查看>>
Linux下查看文件和文件夹大小的df和du命令
查看>>
【excel技巧读书笔记004】在一个窗口显示多个工作薄
查看>>
我的Linux生涯之Mysql:[Mysql基础命令总结]
查看>>
学习PHP精粹,编写高效PHP代码之自动测试
查看>>
mysql索引
查看>>
centos7优化内核参数详解
查看>>
安装 Apache 出现 <OS 10013> 以一种访问权限不允许的方式做了一个访问套接字的尝试...
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
linux非交互式生成秘钥
查看>>
SQL Server数据库镜像搭建(无见证无域控)
查看>>
C练习小代码-20151108
查看>>