【leetcode刷题笔记】Divide Two Integers
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的更多相关文章
- LeetCode刷题笔记和想法(C++)
主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
- LeetCode刷题笔记 - 12. 整数转罗马数字
学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...
- Leetcode刷题笔记(双指针)
1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...
- LeetCode刷题笔记(1-9)
LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...
- leetcode刷题笔记
(1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...
- leetcode刷题笔记08 字符串转整数 (atoi)
题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...
- 【leetcode刷题笔记】Count and Say
The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...
- LeetCode刷题笔记-回溯法-分割回文串
题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...
随机推荐
- SQL中拆分字符串substr及统计字符出现频数replace用法实例讲解
一.拆分字符串为若干行 例一:要求将表emp中的'king'按照每行一个单词拆成四行 注意:substr(str,pos):截取pos位置开始的字符: substr(str,pos,len):从pos ...
- 【转】GitHub入门详细讲解
第一:请登录https://windows.github.com/ 下载您需要的安装软件,进行安装.安装后桌面有:GitHub 和 Git Shell 第二: 申请一个帐号https://github ...
- Session和Cookie之间存在的区别与联系
一. 概念理解 你可能有留意到当你浏览网页时,会有一些推送消息,大多数是你最近留意过的同类东西,比如你想买桌子,上淘宝搜了一下,结果连着几天会有各种各样的桌子的链接.这是因为 你浏览某个网页的时候,W ...
- MQTT--入门 续
1.消息模型: MQTT是一种基于代理的发布/订阅的消息协议.提供一对多的消息分发,解除应用程序耦合.一个发布者可以对应多个订阅者,当发布者发生变化的时候,他可以将消息一一通知给所有的订阅者.这种模 ...
- UVa 437 The Tower of Babylon(DP 最长条件子序列)
题意 给你n种长方体 每种都有无穷个 当一个长方体的长和宽都小于还有一个时 这个长方体能够放在还有一个上面 要求输出这样累积起来的最大高度 由于每一个长方体都有3种放法 比較不好控制 ...
- 分享牛人就是的volatilekeyword
volatile作用 一个定义为volatile的变量是说这变量可能会被意想不到地改变.这样,编译器就不会去如果这个变量的值了. 精确地说就是.优化器在用到这个变量时必须每次都小心地又一次读取这个变量 ...
- wxWidgets之wxGrid控件
1. 介绍 wxGrid控件时wxWidgets界面库中内置的网格控件. 通经常使用来显示表格数据.该控件拥有强大的功能.开发人员可依据自己的需求对其进行定制. 2. 经常使用API 构造函 ...
- IntelliJ IDEA(2017)下载并破解
idea激活,JetBrain旗下软件激活 我在修改这个博主的文章再添加了code码 http://blog.csdn.net/qq_24504453/article/details/77407329 ...
- ANDROID常用的命令(转载,后续自己完善)
1.adb devices:查看当前已连接的设备.2.adb shell:进入android的shell模式.3.echo 3>/proc/sys/vm/drop_caches:清除一下系统的c ...
- 求重集的r-组合
具体的就不在这里说了,如果有兴趣的可以把我的工程包下载下来看,留个URL http://pan.baidu.com/s/1bnes1HX