leetcode29——两数相乘

大佬解法:

力扣

 关于int类型和long类型

区别1
16位系统:long是4字节,int是2字节
32位系统:long是4字节,int是4字节
64位系统:long是8字节,int是4字节
区别2
long和int的区别就是他们的占位长度不同 其中long是64位、而int是32位————010101011这样的
区别3

int: 32位整数 -2,147,483,648——2,147,483,647,一般来说整数都够用了————10位

long: 64位整数 -9,223,372,036,854,775,808—— 9,223,372,036,854,775,807,一般不需要用————19位

关于Integer.MIN_VALUE和Integer.MAX_VALUE

2147483647
-2147483648

本题我只会暴力解法,而且对于越界的还没处理好

首先有四个排除性

当被除数 为0 时,直接返回0

当被除数与除数相等时,返回1

当除数为1,被除数如果超过最大值  则返回最大值  否则返回被除数

当除数为-1时,被除数如果小于最小值 则返回最小值  否则返回被除数*-1

涉及到一个int转long

因为比较好的方法 是通过改变步长来求,何为改变步长

在暴力解法中,我是直接不断使被除数减除数 直到 不能再减为止

这样每次的步长都是固定的,但不妨大胆点 如果被除数很大,除数很小,那么步长也可以大些

所以就有

public int div(long a,long b){
    if(a<b) return 0;
    int count=1;    //统计被除次数
    long tem=b;
    while((tem+tem)<=a){
        count=count+count;    //因为条件是两个tem  所以次数也是两倍
        tem=tem+tem;        //再后面进入循环中 依旧两倍走下去
    }//上述循环可以达到每次都算2倍2倍 以指数级别增长

    return count+div(a-tem,b);//这里的话  第一次循环求出最大count,剩下就缩小被除数 看对原始b能除几次
}

那么本题为什么要修改int转long呢?因为有的值可能接近最大值或最小值

如果tem一直增长到十位数时 如:1,147,483,647

那么在循环体中1,147,483,647+1,147,483,647 就超过最大值了  这是tem又变为

leetcode29——两数相乘

 然后接着再次循环就会变为0

leetcode29——两数相乘

这样就进入了死循环。

 

完整代码

class Solution {
    public int divide(int dividend, int divisor) {
        //先排除特例值
        if(dividend==0) return 0;
        if(dividend == divisor) return 1;
        if(divisor == -1){
            if(dividend>Integer.MIN_VALUE) return -dividend;
            return Integer.MAX_VALUE;
        }
        if(divisor == 1){
            if(dividend<Integer.MAX_VALUE) return dividend;
            return Integer.MAX_VALUE;
        }

        long diva=(long)dividend;
        long divb=(long)divisor;

        //判断正负
        int sign=1;
        if( (diva<0 && divb >0) || ( diva>0 && divb <0 ) ){
            sign=-1;
        }

        //long  类型和int 类型差异需补一下
        //判断正负之后统一为正数
        diva=diva>0?diva:-diva;
        divb=divb>0?divb:-divb;


        //核心部分
        int res=div(diva,divb);

        res=res>Integer.MAX_VALUE?Integer.MAX_VALUE:res;

        //还原正负
        res=(sign>0)?res:-res;

        return (int)res;
    }

    public int div(long a,long b){//这里是int的时候不行  只有long才行 为啥?
        //if(a==b) return 1;
        if(a<b) return 0;

        int count=1;

        long tem=b;
        while((tem+tem)<=a){
            count=count+count;
            tem=tem+tem;
        }

        return count+div(a-tem,b);

    }
}

上一篇:Android多种方式实现相机圆形预览 看这一篇就够了,吐血整理


下一篇:第05章 MySQL排序与分页