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 = 10 + 1 = 10 + 0 = 01 + 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也真是无语,就天天加法不让加 ,乘法不让乘,除法不让除,那就是纯纯恶心人呗)