一天一道LeetCode系列

(一)题目

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

If it is overflow, return MAX_INT.

(二)解题

这题看起来很简单,一开始想到的方法就是从0开始一次累加除数,一直到比被除数大为止,好无悬念,这样做的结果就是超时了。

用移位来实现除法效率就比较高了。具体思路可以参考二进制除法。下面举个例子来说明。

例如:10/2 即10010/10

第一步:1-10不够减,结果添0,左移位变成10

第二步:10-10够减,结果添1,余010,左移位0

第三步:0-10不够减,结果添0,左移一位变成01

第四步:1-10不够减,结果添0,左移一位变成10

第五步:10-10够减,结果添1,后面没有位了,运算完毕

10010 = 10 01001 即 10 = 2 5。

那么按照这种思路,我们每次对除数进行移位,找到等于或小于被除数(dividend)的最大值(max),判断移位次数k,结果ret += 1<<k,然后dividend-=max,依次循环,知道dividend小于除数就运算完毕了。

还是以10/2为例

第一步:对2移位,找到等于或小于10的最大值8,移位次数k=2,ret=4,dividend = 10-8=2;

第二步:对2移位,找到等于或小于2的最大值2,移位次数k=0,ret=4+1=5,dividend=0

运算完毕!


class Solution {

public:

    int divide(int dividend, int divisor) {

        if(divisor == 0) return 2147483647;//限制除数不能为0

        long long absdividend = abs((long long)dividend);//定义long long类型是为了防止越界

        long long absdivisor = abs((long long)divisor);//求绝对值

        long long ret = 0;

        while(absdividend >= absdivisor)//循环条件被除数大于除数

        {

            long long count = 1;

            long long tmpdiv = absdivisor;//初始值为除数

            while(tmpdiv<=absdividend){//移位后判断

                count<<=1;

                tmpdiv<<=1;

            }//找到了小于或等于被除数的最大值

            absdividend-=(tmpdiv>>1);//注意此处最大值应为tmpdiv>>1

            ret +=(count>>1);//上面多左移了一次,这里右移回来

        }

        if((dividend>0&&divisor<0)||(dividend<0&&divisor>0)){//判断正负

            ret = 0-ret;

        }

        if(ret>2147483647 ||ret<-2147483648) return 2147483647;//判断越界

        return (int)ret;//强制转换成int后退出

    }

};

【一天一道LeetCode】#29. Divide Two Integers的更多相关文章

  1. [LeetCode] 29. Divide Two Integers 两数相除

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  2. Java [leetcode 29]Divide Two Integers

    题目描述: Divide two integers without using multiplication, division and mod operator. If it is overflow ...

  3. [leetcode]29. Divide Two Integers两整数相除

      Given two integers dividend and divisor, divide two integers without using multiplication, divisio ...

  4. [LeetCode] 29. Divide Two Integers(不使用乘除取模,求两数相除) ☆☆☆

    转载:https://blog.csdn.net/Lynn_Baby/article/details/80624180 Given two integers dividend and divisor, ...

  5. [leetcode]29. Divide Two Integers 两整数相除

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  6. [LeetCode] 29. Divide Two Integers ☆☆

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

  7. [LeetCode]29. Divide Two Integers两数相除

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  8. LeetCode 29 Divide Two Integers (不使用乘法,除法,求模计算两个数的除法)

    题目链接: https://leetcode.com/problems/divide-two-integers/?tab=Description   Problem :不使用乘法,除法,求模计算两个数 ...

  9. LeetCode: 29. Divide Two Integers (Medium)

    1. 原题链接 https://leetcode.com/problems/divide-two-integers/description/ 2. 题目要求 给出被除数dividend和除数divis ...

  10. [leetcode] 29. divide two integers

    这道题目一直不会做,因为要考虑的corner case 太多. 1. divisor equals 0. 2. dividend equals 0. 3. Is the result negative ...

随机推荐

  1. HTTP状态码总结

    HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码.有些 App 端接口与 HTML 接口用的是同一个,所以做移动端开发也有必要了解一下HTTP状态码 ...

  2. 理解 Linux 的硬链接与软链接

    Linux 的文件与目录 现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程创建信息的逻辑单元可被多个进程并发使用.在 UNIX 系统中,操作系统为磁盘上的文本与图像.鼠标与键盘 ...

  3. Android7.0 多窗口你值得拥有

    Android7.0 多窗口你值得拥有 什么是多窗口分屏? 多窗口分屏其实在国内并不陌生,已经有一些手机和平板搭载了"分屏多任务"和"APP窗口化"功能,但这些 ...

  4. Mac版Android Studio的安装和使用

    Android Studio已经出来很长时间了,据说谷歌会逐步放弃对Eclipse的支持,而把心思完全放在Android Studio上,鉴于Eclipse的各种不稳定,或许这将成一种趋势,因此,没事 ...

  5. 1081. Rational Sum (20) -最大公约数

    题目如下: Given N rational numbers in the form "numerator/denominator", you are supposed to ca ...

  6. antlr v4 使用指南连载3——g4文件概览

    g4文件概览        在深入介绍之前,有必要先给大家了解一下g4文件的结构,以便对如何编写语法规则文件有个全局的认识,我想这是大有禆益的.因为这样我们就可以很清晰地知道需要的东西写在哪里,或者哪 ...

  7. 关于weak

    #define DECLARE_WEAK_SELF __typeof(&*self) __weak weakSelf = self #define DECLARE_STRONG_SELF __ ...

  8. 【Android应用开发】Android Studio 错误集锦 -- 将所有的 AS 错误集合到本文

    . 一. 编译错误 1. "AndroidManifest.xml file not found" 错误 (1) 报错信息 报错信息 : -- Message Make : Inf ...

  9. 关于V4L2中操作比较重要的几个命令以及一般操作流程总结

    最近在做关于摄像头测试程序相关的一些开发,主要是想要实现在摄像头采集视频的过程中,通过按键来实现拍照,然后将拍照得到的数据保存到一个文件中,通过了解V4L2的一些相关操作,原来,拍照后的数据是保存在一 ...

  10. android git上开源的项目收藏

    本文为那些不错的Android开源项目第一篇--个性化控件(View)篇,主要介绍Android上那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Ga ...