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


题解:要求不用乘除和取模运算实现两个数的除法。

那么用加减法是很自然的选择。不过如果一次只从被除数中剪掉一个除数会TLE。所以我们借助移位运算,依次从被除数中减去1个除数,2个除数,4个除数......当减不动的时候,再依次从被除数中减去......4个除数,2个除数,1个除数。

例如50除以5的计算过程如下:

dividend     exp     temp     answer    
50 5 1 0
45 10 2 1
35 20 4 3
15 40 8 7
15 20 4 7
15 10 2 7
5 5 1 9
0 1 0 10

要注意的一点是在计算过程中要把除数和被除数转换成long型,WA一次,输入是[-2147483648,1],在java中最大正整数是2147483647,最小的负整数是-2147483648.所以如果给上述的例子,把被除数去绝对值的时候就去不了,所以要把被除数转换成long型再去绝对值。

代码如下:

 public class Solution {
public int divide(int dividend, int divisor) {
if(dividend == 0)
return 0; boolean isNeg = (dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0);
long answer = 0;
long temp = 1;
long dividend_long = Math.abs((long)dividend);
long divisor_long = Math.abs((long)divisor);
long exp = divisor_long; while(dividend_long - exp >= 0){
answer += temp;
temp = temp << 1;
dividend_long -= exp;
exp = exp << 1;
}
temp = temp >> 1;
exp = exp >> 1;
while(temp >= 1 && dividend_long > 0){
if(dividend_long - exp >= 0){
answer += temp;
dividend_long -= exp;
}
temp = temp >> 1;
exp = exp >> 1;
} if(isNeg)
answer = -answer;
return (int)answer;
}
}

【leetcode刷题笔记】Divide Two Integers的更多相关文章

  1. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  2. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...

  3. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

  4. Leetcode刷题笔记(双指针)

    1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...

  5. LeetCode刷题笔记(1-9)

    LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...

  6. leetcode刷题笔记

    (1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...

  7. leetcode刷题笔记08 字符串转整数 (atoi)

    题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...

  8. 【leetcode刷题笔记】Count and Say

    The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...

  9. LeetCode刷题笔记-回溯法-分割回文串

    题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...

随机推荐

  1. Install Erlang and Elixir in CentOS 7

    In this tutorial, we will be discussing about how to install Erlang and Elixir in CentOS 7 minimal s ...

  2. oc 经常用到弹出view的方法

    #pragma mark 弹出view -(void)exChangeOut:(UIView *)changeOutView dur:(CFTimeInterval)dur { CAKeyframeA ...

  3. elasticsearch 单节点实现

    一.安装java环境,这么不说了,一般用源码安装,配置好环境变量 二.新建es用户和组,es不能用root启动 三.下载需要的稳定版es 四.解压安装es .zip /opt/app/ es / 五. ...

  4. 微信支付v3开发(6) 收货地址共享接口

    请看新版教程  微信支付开发(7) 收货地址共享接口V2 本文介绍微信支付下的收货地址共享接口的开发过程. 一. 简单介绍 微信收货地址共享,是指用户在微信浏览器内打开网页,填写过地址后,兴许能够免填 ...

  5. git学习之时光机穿梭(四)

    时光机穿梭 我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容: Git is a distributed ver ...

  6. 【Mysql】之视图操作

    一.视图实例1-创建视图及查询数据操作 首先,创建三个表:user.course.user_course 表:user CREATE TABLE `user` ( `id` ) NOT NULL AU ...

  7. 趣味编程:C#中Specification模式的实现(参考答案 - 下)

    一篇文章中我们利用C#语言的特性实现了一种轻量级的Specification模式,它的关键在于抛弃了具体的Specification类型,而是使用一个委托对象代替唯一关键的IsSatisfiedBy方 ...

  8. zookeeper的python客户端安装

    项目中使用了python,需要使用到zookeeper的功能,这里记录一下安装过程. 内核版本:2.6.32 发行版:CentOs-6.6 64bit 1.由于python客户端依赖c的客户端所以要先 ...

  9. ios8 一些运行问题

     iOS10相册相机闪退bughttp://www.jianshu.com/p/5085430b029fiOS 10 因苹果健康导致闪退 crashhttp://www.jianshu.com/p/5 ...

  10. [Sdoi2013]直径(树的直径)

    //36分 #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> # ...