LeetCode刷题报告1

📜个人简介

⭐️个人主页:摸鱼の文酱博客主页🙋‍♂️
🍑博客领域:java编程基础,mysql
🍅写作风格:干货,干货,还是tmd的干货
🌸精选专栏:【Java】【mysql】 【算法刷题笔记】
🎯博主的码云gitee,平常博主写的程序代码都在里面。
🚀支持博主:点赞👍、收藏⭐、留言💬
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!

1.今日学习内容

https://blog.csdn.net/WhereIsHeroFrom/article/details/120876221

2.今日刷题记录

371. 两整数之和

题目链接:https://leetcode-cn.com/problems/sum-of-two-integers/
题目要求:
给你两个整数 a 和 b ,不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和。
思路:
要想解决这个问题,首先要理解:原码,反码,补码以及位运算,可以参考这个博客:
https://editor.csdn.net/md/?articleId=122446364
二进制的数字相加,无非为以下四种情况:

1 + 0  = 1
0 + 1  = 1
0 + 0  = 0
1 + 1  = 0(要进位)
也就是说,我们只要将相加分为两种情况:
一种是相加不需要进位的,另一种是相加需要进位的

由此可知,只要能够将每一个二进制位的结果求出,就能得到最后的数字
根据位运算的法则: 1 & 0 = 0 , 1 & 1 = 1; 0 ^ 1 = 1;
两个整数a, b; a ^ b是无进位的相加; a&b得到每一位的进位;让无进位相加的结果与进位不断的异或, 直到进位为0;
按照以上思路,先试着实现一下:

public  int getSum(int a, int b){  
   int sum, carry;//先创建两个数,分别存储两种相加情况的结果
    sum = a ^ b;  //异或这里可看做是相加但是不显现进位,0+1或者是1+0都不用进位
    carry = (a & b) << 1;//相与为了让进位显现出来,1和1相与得1,而在二进制加法中,这里1+1也应该是要进位的,所以这个进位1应该要再往前一位,所以左移一位
	if(carry != 0)  //经过上面这两步,如果进位不等于0,那么就是说还要把进位给加上去,所以用了尾递归,一直递归到进位是0。
        {
            return getSum(sum, carry);
        }
        return sum;
}

在这里插入图片描述
过了,但是一看评论区,果然还有大佬,提供优化版本如下:
思路基本和上面的差不多,这里没有使用递归,相对更好理解一些

public int getSum(int a, int b) {
        while (b != 0) {
            int carry = (a & b) << 1; 
            a = a ^ b;
            b = carry;
        }
        return a;
    }

同类型题:
面试题 17.01. 不用加号的加法
剑指 Offer 65. 不用加减乘除做加法

面试题 08.05. 递归乘法

题目链接:https://leetcode-cn.com/problems/recursive-mulitply-lcci/
题目描述:递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。
思路:
1.第一次看到这个题时,就不由自主想起了小学的时候老师第一次叫乘法的时候:乘法实际上就是若干相同加法的表示,3 * 4就可以理解为3个4相加,那这样想的话就很清晰了,但是有点害怕的是会超出限制(谁知道他用例会不会给俩int类型的最大数),还是先提交试一下:
java代码:

//非递归
public int multiply(int A, int B) {
       int sum = 0;
       while(B!=0){
           sum+=A;
           B--;
       }
       return sum;
    }
    //递归
public int multiply(int A, int B) {
       if(B==0)
        return 0;
    return A+multiply(A,B-1);
    }

还好,还是过了
在这里插入图片描述
2.位运算yyds
把A B 两个数中较小的那个通过右移化简成1,这个过程中让结果相应的左移,如果左移时有余数的话,还要记得补上。

public int multiply(int A, int B) {
    if(A>B)
        return multiply(B,A);
    if(A==1)
        return B;
    if(A%2==0)
        return multiply(A>>1,B)<<1;
    else
        return (multiply(A>>1,B)<<1)+B;

}

一个投机套路
申请一个大小为a×ba×b的数组
计算其大小,并返回

class Solution {
public:
    int multiply(int A, int B) {
        return (int)sizeof(bool[A][B]);
    }
};

29.两数相除

问题链接:https://leetcode-cn.com/problems/divide-two-integers/?from=from_parent_mindnote
问题描述:给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去truncate其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
(这leetcode也真是无语,就天天加法不让加 ,乘法不让乘,除法不让除,那就是纯纯恶心人呗)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值