lintcode 中等题:Divide Two Integers 两个数的除法
题目
将两个整数相除,要求不使用乘法、除法和 mod 运算符。
如果溢出,返回 2147483647 。
给定被除数 = 100 ,除数 = 9,返回 11
解题
15%的通过率,减法,位运算?表示不知道如何下手。
法一:利用减法,超时,人工直接去除的一些情况太流氓。
public class Solution {
/**
* @param dividend the dividend
* @param divisor the divisor
* @return the result
*/
public int divide(int dividend, int divisor) {
// Write your code here
if(dividend == 0)
return 0;
if(dividend == divisor)
return 1;
int count = 0;
int flag1 = 1;
int flag2 = 1;
if(dividend == Integer.MIN_VALUE && divisor ==1)
return dividend;
if(dividend == Integer.MIN_VALUE && divisor == -1)
return 2147483647;
if(dividend<0){
flag1 = -1;
dividend = -dividend;
}
if(divisor<0){
flag2 = -1;
divisor = -divisor;
}
// dividend = 2147483647;
// divisor = 2;
if(divisor == 1)
return dividend*flag1*flag2;
while(dividend >= divisor){
dividend -= divisor;
count +=1;
}
return count*flag1*flag2;
}
}
Java Code
法二:批量减法,参考博客,但是还是超市,除数是1的时候超时,是1的时候我单独处理,是2的时候超时
public class Solution {
/**
* @param dividend the dividend
* @param divisor the divisor
* @return the result
*/
public int divide(int dividend, int divisor) {
// Write your code here
if(dividend == 0)
return 0;
if(dividend == divisor)
return 1;
int count = 0;
int flag1 = 1;
int flag2 = 1;
if(dividend == Integer.MIN_VALUE && divisor ==1)
return dividend;
if(dividend == Integer.MIN_VALUE && divisor == -1)
return 2147483647;
if(dividend<0){
flag1 = -1;
dividend = -dividend;
}
if(divisor<0){
flag2 = -1;
divisor = -divisor;
}
// dividend = 2147483647;
// divisor = 2;
if(divisor == 1)
return dividend*flag1*flag2;
while(dividend >= divisor){
int sum = divisor;
int count1 = 1;
while(sum + sum <= dividend){
count1 += count1;
sum += sum;
}
dividend -= sum;
count += count1;
}
return count*flag1*flag2;
}
}
Java Code
法三:利用位运算
参考博客,感觉与法二很像的,我把二中减肥换成位运算,也是运行超时,我不理解,直接用他的程序就可以通过。
public class Solution {
/**
* @param dividend the dividend
* @param divisor the divisor
* @return the result
*/
public int divide(int dividend, int divisor) {
// Write your code here
if(divisor ==0)
return Integer.MAX_VALUE;
if(divisor == -1 && dividend == Integer.MIN_VALUE)
return Integer.MAX_VALUE;
int count = 0;
long pDividend = Math.abs((long)dividend);
long pDivisor = Math.abs((long)divisor);
while(pDividend >= pDivisor){
int count1 = 0;
while((pDivisor<<count1)<= pDividend){
count1++;
}
count += 1<<(count1 - 1);
pDividend -=(pDivisor<<(count1 - 1));
}
if( dividend >0 && divisor >0 || dividend<0 && divisor<0)
return count;
else
return -count;
}
}
Java Code
博客中的位运算改成减法的也可以通过,就是我自己搞的减法的就是能通过,无法理解
public class Solution {
/**
* @param dividend the dividend
* @param divisor the divisor
* @return the result
*/
public int divide(int dividend, int divisor) {
// Write your code here
if(divisor ==0)
return Integer.MAX_VALUE;
if(divisor == -1 && dividend == Integer.MIN_VALUE)
return Integer.MAX_VALUE;
int count = 0;
long pDividend = Math.abs((long)dividend);
long pDivisor = Math.abs((long)divisor);
while(pDividend >= pDivisor){
int count1 = 1;
long sum = pDivisor;
while(( sum + sum)<= pDividend){
count1 += count1;
sum +=sum;
}
count += count1;
pDividend -= sum;
}
if( dividend >0 && divisor >0 || dividend<0 && divisor<0)
return count;
else
return -count;
}
}
Java Code
lintcode 中等题:Divide Two Integers 两个数的除法的更多相关文章
- LeetCode 29 Divide Two Integers (不使用乘法,除法,求模计算两个数的除法)
题目链接: https://leetcode.com/problems/divide-two-integers/?tab=Description Problem :不使用乘法,除法,求模计算两个数 ...
- [LintCode] Divide Two Integers 两数相除
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- 【LeetCode每天一题】Divide Two Integers(两整数相除)
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- [LeetCode] Divide Two Integers 两数相除
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- lintcode 中等题:Single number III 落单的数III
题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...
- [leetcode]29. Divide Two Integers两整数相除
Given two integers dividend and divisor, divide two integers without using multiplication, divisio ...
- [LeetCode] 29. Divide Two Integers 两数相除
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- 2016网易实习生编程题:数组中两个数的和等于sum
题目 找出数组中两个数的和等于sum的这两个数 解题 这个题目做过很多次了,利用HashMap,key为 sum-A[i] value为 i 当 加入HashMap时候A[i] 已经存在map中,ge ...
- leetcode第28题--Divide Two Integers
Divide two integers without using multiplication, division and mod operator. 分析:题目意思很容易理解,就是不用乘除法和模运 ...
随机推荐
- php intval()函数
格式:int intval(mixed $var [, int $base]); 1.intval()的返回值是整型,1或者0.可作用于数组或者对象(对象报错信息:Notice: Object of ...
- linux文件的通用操作方法学习
2014-07-29 23:36:10 在linux下用文件描述符来表示设备文件和普通文件.文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符实现. 文件描述符示文件系统中连接用户空间和内核 ...
- java之jar命令详解
1. JAR 文件包 JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式.JAR 文件非常类似 ZIP 文件——准确的说, ...
- [原创]CentOS6.4编译安装Facebook的folly库(gcc4.8.1boost1.5.3)
Folly: Facebook Open-souce LibrarY,Facebook开源的一个基础组件库,据说在大规模的场景中性能较高.目前因为自己负责的系统有几个地方性能较差,因此特意找来看看 ...
- ZOJ 3229 有上下界最大流
1: /** 2: ZOJ 3229 有上下界的最大流 3: 两次求最大流的过程,非二分 4: 有源汇上下界的最大流问题, 首先连接 sink -> src, [0,INF]. 5: 根据net ...
- 11.1Daily Scrum
人员 任务分配完成情况 明天任务分配 王皓南 主网页的框架搭建,任务编号760 研究代码,学习相应语言,讨论设计思路 申开亮 学习数据库的操作,任务编号761 研究代码,学习相应语言,讨论设计思路 王 ...
- 面试中问到SpringMVC与struts的区别
1.先简单的介绍一下SpringMVC 废话不多说,其实SpringMVC就是一个MVC的框架,SpringMVC它的annotation式的开发比struts 开发的方便很多,可以直接代替strut ...
- Android ADB 端口占用问题解决方案
问题描述: The connection to adb is down, and a severe error has occured. You must restart adb and Eclips ...
- Luence简单实现1
初步认识Luence,简单按照官方文档做了个例子,大牛绕开,仅供小白路过参考.如有错误,欢迎指正批评. 建一个简单工程,并且加入这几个小奶瓶,如下图: 注:版本不同,可能对jdk的需求是不同的,这个需 ...
- word小技巧
如何将英文和数字替换为times new romans 1,点击替换(ctrl+H) .2,在查找内容中输入”([A-Z0-9])“(不包括引号,但包括小括号),这是替换所有大写字母和数字,如果还想替 ...