主要知识点
直接使用字符串输出溢出结果也是一个可取的方法。
习题
1. Leetcode 476. 数字的补数
题目描述
对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。
例如,整数 5 的二进制表示是 “101” ,取反后得到 “010” ,再转回十进制表示得到补数 2 。
给你一个整数 num ,输出它的补数。
提示: 1 ≤ n u m < 2 31 1 \leq num < 2^{31} 1≤num<231
初见
既然说是按位取反,那么我们直接按照题意进行计算即可:
int findComplement(int num) {
int result(0);
int i(0);
while (num > 0) {
result = result | ((num & 0x1 ^ 0x1)<<i);
num >>= 1;
++i;
}
return result;
}
时间复杂度位 O ( l o g N u m ) O(logNum) O(logNum)(实际寻找的次数为 2 n 2^n 2n)
思路
我们也可找出最高位的 1 后,找到与 n u m num num 匹配的标识符(低位均为 1),用其与 n u m num num 位或得到答案
代码
int findComplement(int num) {
int highbit = 0;
for (int i = 1; i <= 30; ++i) { // int,最大 31 位
if (num >= (1 << i)) { // 记录最高位
highbit = i;
}
else {
break;
}
}
// 计算标识符
int mask = (highbit == 30 ? 0x7fffffff : (1 << (highbit + 1)) - 1);
return num ^ mask;
}
2. Leetcode 7. 整数反转
题目描述
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
提示: − 231 ≤ x ≤ 231 − 1 -231 \le x \le 231 - 1 −231≤x≤231−1
初见
求逆序数应该是很熟悉的一套东西了,唯一需要注意的是不能使用超过 32 位的存储方式。那么我们只需要在边界时做好越界判断,返回 0 即可。
代码
int reverse(int x) {
int result(0);
while (x != 0) {
// 越界判断
if (result < INT_MIN / 10 || result > INT_MAX / 10) {
return 0;
}
result = result * 10 + x % 10;
x /= 10;
}
return result;
}
总结
- 两道题都不算难,其中第一题再次强调了位运算的重要性。