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

就是因为负数的范围更广,所以涉及到正负数的运算应该往负数这方面转;不要按照正常的逻辑走;还有正序比顺序快的前提是:正序实现的就是逆序的逻辑,但是不是的时候,可能迭代更快一些;想特殊的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){
			return 0;
		}
		
		int temp = divisor;
		ret = 1;
		int count = 0;
		while(temp > 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){
			return 0;
		}
		
		int temp = divisor;
		ret = 1;		
		while(temp > 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;
    }
}

恩,其实做过类似的题,总是忘,再记录一次。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值