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

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

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

以前我记得做过乘法变加法吧,这个有点像除法变减法,用位运算,二进制嘛,左移一位相当于乘以二。

一个有趣的是 Math.abs(-2147483648) 结果还是 -2147483648. 在进行该运算前,要将其转化为long类型。

第一种方法,采取两个while循环来确定需要减多少,c简单理解其实就是商。这个方法显得有些累赘,不过AC了。

public int divide(int dividend, int divisor) {        if (divisor == 0 || dividend == Integer.MIN_VALUE && divisor == -1)            return Integer.MAX_VALUE;        int sign = 1;        if (dividend < 0)            sign = -sign;        if (divisor < 0)            sign = -sign;        long temp1 = Math.abs((long) dividend);        long temp2 = Math.abs((long) divisor);        long c = 1;        while (temp1 > temp2) {            temp2 = temp2 << 1;            c = c << 1;        }        int res = 0;        while (temp1 >= Math.abs((long) divisor)) {            while (temp1 >= temp2) {                temp1 -= temp2;                res += c;            }            temp2 = temp2 >> 1;            c = c >> 1;        }        if (sign > 0)            return res;        else            return -res;    }

第二种方法,其实跟第一种方法是一样的原理,就是代码简化了一点点。

public int divide(int dividend, int divisor) {        if (divisor == 0 || dividend == Integer.MIN_VALUE && divisor == -1)            return Integer.MAX_VALUE;        int res = 0, sign = (dividend < 0) ^ (divisor < 0) ? -1 : 1;        long dvd = Math.abs((long) dividend), dvs = Math.abs((long) divisor);        while (dvd >= dvs) {            long mul = 1, temp = dvs;            while (dvd >= temp << 1) {                temp <<= 1;                mul <<= 1;            }            dvd -= temp;            res += mul;        }        return res * sign;    }

转载地址:http://pvwva.baihongyu.com/

你可能感兴趣的文章
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>
推荐一个非常好用的 MarkDown 编辑器!
查看>>
使用 Hooks 简化受控组件的状态绑定
查看>>
Canvas && CSS && SVG 三种实现仪表盘的方式
查看>>
简单易懂的谈谈 javascript 中的继承
查看>>
Spark学习之Spark 集群资源调度
查看>>
京东Taro:用技术解放小程序生产力 | 点评家
查看>>
Dart编程语言入门学习
查看>>
小程序登录逻辑
查看>>
vscode透明主题、霓虹灯字体
查看>>
多线程基础知识
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>
Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 实现顶部图片下拉视差效果
查看>>
Flutter之基础Widget
查看>>
写给0-3岁产品经理的12封信(第08篇)——产品运营能力
查看>>
ArcGIS Engine 符号自动化配置工具实现
查看>>
小程序 · 跳转带参数写法,兼容url的出错
查看>>
开源干货!!!.NET Core + Vue.js(iview-admin) 通用动态权限(RBAC)管理系统框架[DncZeus]开源啦!!!...
查看>>