一天一道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. 动手试试Android Studio插件开发

    由于业务关系,经常需要写一些表单页面,基本也就是简单的增删改查然后上传,做过几个页面之后就有点想偷懒了,这么低水平重复性的体力劳动,能不能用什么办法自动生成呢,查阅相关资料,发现android stu ...

  2. Effective Python 中文版

    如题,博主正在翻译一本Python相关的书. 图为Python作者. [美]Brett Slatkin的名作. Effective Python: 59 Specific Ways to Write ...

  3. ROS新闻 Towards ROS-native drones 无人机支持方案

    PX4/Firmware:https://github.com/PX4/Firmware PXFmini An open autopilot daughter-board for the Raspbe ...

  4. ROS_Kinetic_28 turtlebot gazebo demo例子

    ROS_Kinetic_28 turtlebot gazebo demo例子 官方教程:http://wiki.ros.org/turtlebot_gazebo/Tutorials/indigo/Ma ...

  5. 剑指Offer——CVTE校招笔试题+知识点总结(Java岗)

    剑指Offer(Java岗)--CVTE校招笔试题+知识点总结 2016.9.3 19:00参加CVTE笔试,笔试内容如下: 需要掌握的知识:Linux基本命令.网络协议.数据库.数据结构. 选择题 ...

  6. Android之EditText imeOptions属性解析

    在我们的手机中,虽然通常输入法软键盘右下角会是回车按键,但我们经常会看到点击不同的编辑框,输入法软键盘右下角会有不同的图标.例如:  点击浏览器网址栏的时候,输入法软键盘右下角会变成"GO& ...

  7. 【问题汇总】ScrollView嵌套GridView的问题

    在开发中遇到了ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当它们碰到一起的时候便会出问题,即GridView会显示不全. 解决办法,自定义一个GridView控件. [ ...

  8. 1.Android中解析json程序代码

    Android程序解析json数据可以通过gson的方式,这种情况需要导入相应的jar包.测试代码如下: @Override protected void onCreate(Bundle savedI ...

  9. 插件开发之360 DroidPlugin源码分析(三)Binder代理

    转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52138483 Hook机制中Binder代理类关系图 Hook机制中Binder代理时 ...

  10. git提交代码到github

    前言:转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52117504 git提交代码到github 命令汇总: git init git ...