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;
carry = (a & b) << 1;
if(carry != 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也真是无语,就天天加法不让加 ,乘法不让乘,除法不让除,那就是纯纯恶心人呗)
|