Leetcode Divide Two Integers
2016-07-19 04:49
260 查看
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
Difficulty: Medium
public class Solution {
public long helper(long dividend, long divisor){
if(dividend < divisor) return 0;
long ans = 0;
long curr = divisor, count = 1;
while(dividend >= divisor){
curr = divisor; count = 1;
while(dividend >= curr){
dividend = (dividend - curr);
ans = (ans + count);
curr = curr * 2;
count = count * 2;
}
}
return ans;
}
public int divide(int dividend, int divisor) {
if(divisor == 0) return Integer.MAX_VALUE;
if(dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;
if(dividend == 0) return 0;
if(divisor == Integer.MIN_VALUE) return dividend == Integer.MIN_VALUE ? 1 : 0;
int flag = 0;
if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)){
flag = 1;
}
else{
flag = -1;
}
if(dividend == Integer.MIN_VALUE){
long ans = (helper((long)(Math.abs(dividend + 1)) + 1, (long)(Math.abs(divisor))));
if(ans == (long)(Integer.MAX_VALUE) + 1){
return Integer.MIN_VALUE;
}
return (int)(ans) * flag;
}
return (int)(helper((long)(Math.abs(dividend)), (long)(Math.abs(divisor)))) * flag;
}
}
If it is overflow, return MAX_INT.
Difficulty: Medium
public class Solution {
public long helper(long dividend, long divisor){
if(dividend < divisor) return 0;
long ans = 0;
long curr = divisor, count = 1;
while(dividend >= divisor){
curr = divisor; count = 1;
while(dividend >= curr){
dividend = (dividend - curr);
ans = (ans + count);
curr = curr * 2;
count = count * 2;
}
}
return ans;
}
public int divide(int dividend, int divisor) {
if(divisor == 0) return Integer.MAX_VALUE;
if(dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;
if(dividend == 0) return 0;
if(divisor == Integer.MIN_VALUE) return dividend == Integer.MIN_VALUE ? 1 : 0;
int flag = 0;
if((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)){
flag = 1;
}
else{
flag = -1;
}
if(dividend == Integer.MIN_VALUE){
long ans = (helper((long)(Math.abs(dividend + 1)) + 1, (long)(Math.abs(divisor))));
if(ans == (long)(Integer.MAX_VALUE) + 1){
return Integer.MIN_VALUE;
}
return (int)(ans) * flag;
}
return (int)(helper((long)(Math.abs(dividend)), (long)(Math.abs(divisor)))) * flag;
}
}
相关文章推荐
- Leetcode Sqrt(x)
- Leetcode Number of Digit One
- Leetcode Largest Number
- Leetcode Word Break II
- [leetcode] 118. Pascal's Triangle
- php判断是否为今天
- Codeforces Round #327 (Div. 2)
- 决策树算法(四)——选取最佳特征划分数据集
- 一键安装LAMP或LNMP
- [leetcode] 110. Balanced Binary Tree
- Leetcode 299. Bulls and Cows (Python)
- redhat7.2用户及用户组权限管理操作实例
- zabbix redis_low_level_discovery
- OSChina 周二乱弹 ——风流不需编码强,红袖无言意最长
- rename datafile 做了什么
- Leetcode 373. Find K Pairs with Smallest Sums(Python)
- [LeetCode] 66. Plus One
- CnCrypt代码 之 为磁盘设备分配和移除盘符
- HDU 2203 亲和串
- HDU 2087 KMP求匹配串的重复次数