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又变为

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

这样就进入了死循环。

 

完整代码

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);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,Leetcode 2 "两数相加"是一个涉及链表的问题。该问题给定了两个非负整数,每个整数的每一位都是按照逆序的方式存储在链表中。我们需要将这两个链表相加,并返回一个新的链表作为结果。 具体解题思路可以使用迭代法或递归法来解决。迭代法的伪代码如下所示: ``` 初始化一个哑节点 dummy 和一个进位 carry,同时把两个链表的头节点分别赋值给 p 和 q 遍历链表,直到 p 和 q 都为 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 把新节点连接到结果链表的尾部 更新 p 和 q 分别为 p.next 和 q.next 如果最后还有进位 carry,则创建一个新节点 node,节点的值为 carry,并连接到结果链表的尾部 返回结果链表的头节点 dummy.next ``` 递归法的伪代码如下所示: ``` 定义一个辅助函数 addTwoNumbersHelper,输入为两个链表的头节点 p 和 q,以及进位 carry 如果 p 和 q 都为 None 且 进位 carry 为 0,则返回 None 计算当前的和 sum 为 p.val + q.val + carry 计算当前的进位 carry 为 sum // 10 创建一个新节点 node,节点的值为 sum % 10 设置新节点的下一个节点为递归调用 addTwoNumbersHelper(p.next, q.next, carry) 返回新节点 返回 addTwoNumbersHelper(p, q, 0) 的结果 以上是解决 Leetcode 2 "两数相加"问题的两种方法。如果你还有其他相关问题,请

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值