LeetCode29 实现整除,切记,负数的范围比正数的范围大一个

2019-04-14 16:33发布

就是因为负数的范围更广,所以涉及到正负数的运算应该往负数这方面转;不要按照正常的逻辑走;还有正序比顺序快的前提是:正序实现的就是逆序的逻辑,但是不是的时候,可能迭代更快一些;想特殊的0,1,是一定要想到的;题目:Divide two integers without using multiplication, division and mod operator.If it is overflow, return MAX_INT.想想中的正序的超时的方法:class Solution { public int divide(int dividend, int divisor) { int ret = 0; int sigin=1;//全变成负数 if(dividend == 0){ return ret; } if(dividend<0 && divisor>0){ sigin = -1; divisor = -divisor; } if(dividend>0 && divisor<0){ sigin = -1; dividend = -dividend; } if(dividend>0 && divisor>0){ divisor = -divisor; dividend = -dividend; } if(divisor == -1){ if(sigin == -1){ return dividend; }else{ if(dividend == Integer.MIN_VALUE) dividend++; return 0-dividend; } } if(divisor dividend){ count = ret; if(temp>dividend-temp){ temp = temp + temp; ret =ret + ret; }else{ if(temp == dividend-temp){ temp = temp + temp; ret =ret + ret; break; }else{ for(int i=1;i<=count;i++){ if(temp == dividend - divisor){ ret = ret+i; break; }else{ if(temp < dividend -divisor){ ret = ret+i-1; break; } } temp = temp + divisor ; } } break; } } if(sigin == -1){ return 0- ret; } return ret; } }使用迭代不超时的办法:
class Solution { public int divide(int dividend, int divisor) { int ret = 0; int sigin=1;//全变成负数 if(dividend == 0){ return ret; } if(dividend<0 && divisor>0){ sigin = -1; divisor = -divisor; } if(dividend>0 && divisor<0){ sigin = -1; dividend = -dividend; } if(dividend>0 && divisor>0){ divisor = -divisor; dividend = -dividend; } if(divisor == -1){ if(sigin == -1){ return dividend; }else{ if(dividend == Integer.MIN_VALUE) dividend++; return 0-dividend; } } if(divisor dividend){ if(temp>dividend-temp){ temp = temp + temp; ret =ret + ret; }else{ if(temp == dividend-temp){ temp = temp + temp; ret =ret + ret; break; }else{ ret=ret+divide(dividend-temp,divisor); break; } } } if(sigin == -1){ return 0- ret; } return ret; } }恩,其实做过类似的题,总是忘,再记录一次。