(java) Divide Two Integers
2016-02-17 00:02
666 查看
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
思路,就是实现除法操作。
注意点:1 除数为0
2 存在负数且是最小的负数
这两种情况要特殊处理,其实除法就是用加法来实现的。普通的连加是会超时的,可以翻倍加
比如 被除数是100,除数是3,
设置一个sum和一个count
sum=sum+sum;
count=count+count;
sum=3 count=1
sum=6 count=2;
sum=12 count=4;
sum=24 count=8;
sum=48 count=16;
sum=94 count=32;
被除数还剩4
变成了4除以3,count=32+1=33;
得出结果,时间复杂度符合要求。
代码如下(已通过leetcode)
public class Solution {
public int divide(int dividend, int divisor) {
if(divisor==0) return Integer.MAX_VALUE;
if(dividend==0) return 0;
long tempdividend=dividend;
long tempdivisor=divisor;
tempdividend=Math.abs(tempdividend);
tempdivisor=Math.abs(tempdivisor);
if(tempdividend<tempdivisor) return 0;
long tempres=0;
long sum;
long count;
while(tempdividend>=tempdivisor) {
count=1;
sum=tempdivisor;
while(sum+sum<=tempdividend) {
sum=sum+sum;
count=count+count;
}
tempdividend=tempdividend-sum;
tempres=tempres+count;
}
//System.out.println(tempres);
if((dividend>0) ^ (divisor>0)) tempres=-tempres;
if(tempres>Integer.MAX_VALUE || tempres<Integer.MIN_VALUE) return Integer.MAX_VALUE;
else return (int)tempres;
}
}
If it is overflow, return MAX_INT.
思路,就是实现除法操作。
注意点:1 除数为0
2 存在负数且是最小的负数
这两种情况要特殊处理,其实除法就是用加法来实现的。普通的连加是会超时的,可以翻倍加
比如 被除数是100,除数是3,
设置一个sum和一个count
sum=sum+sum;
count=count+count;
sum=3 count=1
sum=6 count=2;
sum=12 count=4;
sum=24 count=8;
sum=48 count=16;
sum=94 count=32;
被除数还剩4
变成了4除以3,count=32+1=33;
得出结果,时间复杂度符合要求。
代码如下(已通过leetcode)
public class Solution {
public int divide(int dividend, int divisor) {
if(divisor==0) return Integer.MAX_VALUE;
if(dividend==0) return 0;
long tempdividend=dividend;
long tempdivisor=divisor;
tempdividend=Math.abs(tempdividend);
tempdivisor=Math.abs(tempdivisor);
if(tempdividend<tempdivisor) return 0;
long tempres=0;
long sum;
long count;
while(tempdividend>=tempdivisor) {
count=1;
sum=tempdivisor;
while(sum+sum<=tempdividend) {
sum=sum+sum;
count=count+count;
}
tempdividend=tempdividend-sum;
tempres=tempres+count;
}
//System.out.println(tempres);
if((dividend>0) ^ (divisor>0)) tempres=-tempres;
if(tempres>Integer.MAX_VALUE || tempres<Integer.MIN_VALUE) return Integer.MAX_VALUE;
else return (int)tempres;
}
}
相关文章推荐
- java计划任务
- JAVA中MAVEN的使用
- JAVA依托axis2实现计划任务
- JAVA类的继承派生
- JAVA多线程
- java 遍历arrayList的四种方法
- java解析json字符串
- JAVA遍历HASHMAP
- 40个JAVA问题
- eclipse中使用ctrl无法追踪函数(右键无法定位到相应的类)解决方案
- 内存管理机制-JVM 垃圾回收算法
- Java代码块
- 转: Rest简介及Spring实现
- 关于字符串的几个常见问题
- 全排列的递归实现(java代码)
- eclipse里怎么用命令行输入args
- 从头认识Spring-2.6 在注解中使用表达式@Value(2)-使用表达式注入其他对象的值
- java如何将一个序列化对象添加到压缩文件中
- Java学习之静态修饰符:static
- xwiki 7.14 Windows安装教程(jetty + MySQL5.7+jdk1.7)