一天一道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. logistic分类

    对Logistic回归模型,个人做的一些总结: 公式就不套用了,教材上面基本都有而且详细.logistic回归用图形化形式描述如下: logistic回归是一种简单高效的分类模型,它不仅可以通过学习来 ...

  2. CentOS7.2安装Weblogic12c出现的问题

    Weblogic12c安装到步骤:Prerequisite  Checks 时,会进行操作系统版本的校验,即checking  operating  system  certification. 此处 ...

  3. GirlFriendNotFoundException异常是怎样处理的?

    GirlFriendNotFoundException异常是怎样处理的? 如果说要去创造这个异常,那么我们的JAVA程序里,肯定是继承Exception去处理,所有我们可以先实现一个自己的Except ...

  4. Ubuntu LTS 系统学习使用体会和实用工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04

    Ubuntu LTS 系统学习体会和工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04 ubuntu入门必备pdf:http://download.csdn.net/de ...

  5. [ExtJS5学习笔记]第三十五节 sencha extjs 5 组件查询方法总结

    一个UI前台组件肯定会比较多,我们通常习惯性的使用ID来获取需要操作的组件,但是这种方法是extjs推荐的么?有没有extjs推荐使用的获取组件的方法呢? 目录 目录 extjs的查询组件的API 查 ...

  6. OpenCV:Mat元素访问方法、性能、代码复杂度以及安全性分析

    欢迎转载,尊重原创,所以转载请注明出处: http://blog.csdn.net/bendanban/article/details/30527785 本文讲述了OpenCV中几种访问矩阵元素的方法 ...

  7. Xcode的playground中对于SpriteKit物理对象的更新为何无效

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 为了便于SpriteKit中物理行为的调试,我们可以借助于Xc ...

  8. 19 主线程向子线程发送信息(handler)

    package com.fmy.handler; import android.app.Activity; import android.os.Bundle; import android.os.Ha ...

  9. ArrayList、HashMap、HashSet源码总结

    ArrayList: 1. ArrayList是List接口的大小可变数组的实现,此实现是不同步的. 2. ArrayList内部使用类型为Object[]的数组存储元素. 3. ArrayList默 ...

  10. 【移动开发】Context类bindService()参数

    bindService()是Context的一个方法,它是抽象的.函数原型的代码如下:(android 2.3.3) /** * Connect to an application service, ...