千山万水总有路,勇敢迈出第一步!!!
一、吹逼
今日学习内容:https://bbs.youkuaiyun.com/topics/605594042
是被位运算爱恋的一天呀
今日最牛,反转、跳跃、我不停歇~~~ 不停歇 ~~~ 2119 你值得拥有!!!
二、晒战绩
话不多说,上图~ 👇
三、写解题报告
有点感受的两道题:
371.两整数之和:题目理解 → 不使用算术运算,求和,只能使用位运算:& and、| or、^ xor。
- 第一步:确定方法是使用位运算代替算术运算;
- 第二步,举个例子,输入样例 和 输出样例,列出 a 、b、a+b 的二进制;
- 第三步,手算,看看通过什么操作可将 输入 向 输出靠近,找出循环的单元,归纳出循环结束的条件;
- 第四步,代码测试~ let it go ~~~
整个过程,酷似 数学归纳,但一定要能证明结论的正确性,需要一点数学知识和运气!!!
嘿~~ 总结结论如上,灵感来自于 官方题解,不会就看题解,不然你还等啥!!!
class Solution {
public:
int getSum(int a, int b) {
// 不可使用 +、-,基本代表答案在底层的 补码位移运算上
// & and | or ^ xor
// 列举观察,归纳总结,重点在 while loop 的结束上
while(b!=0) {
unsigned int add = (unsigned int)(a&b) << 1;
a = a^b;
b = add;
}
return a;
}
};
2119. 反转两次的数字:题目理解 → 将一个 0~10^6 之间的整数,连续反转两次依然和原来的值相等,则返回 true,否则返回 false。
怎么破?观察呀,观察!枚举呀,枚举!
- 0 或者 说个位数 [0, 9],怎么反转都是自己个;
- [10, 10^6]
- 个位数是 0,反转,不行,高位 0 没意义了
- 个位不是 0,反转、反转,偶数次反转都行,结果还是自己个
综上,整理下,代码 👇
class Solution {
public:
bool isSameAfterReversals(int num) {
if(num!=0 && num%10==0) return false;
return true;
}
};
四、写给明天
多美美好的一天呀~~ 喜刷刷,喜刷刷 😀😀😀