2020.10.31每日复习
868.二进制间距
分析
- 采用向右移位并与1相与,若结果为1,说明当前位为1,则用当前的移位数减去上一个位为1的索引,并判断当前的相隔距离与现在计算出来的哪个大
- 我们用 last 存储上一个 1 的位置。如果数字 N 在第 i 个位置为 1,则我们的候选答案为 i - last,然后更新 last = i。
class Solution {
public int binaryGap(int n) {
int last = -1;
int res = 0;
for(int i = 0; i < 32; i++) {
if(((n >> i) & 1) != 0) { //若当前位为1
if(last != -1) {
res = Math.max(res, i - last);
}
last = i;
}
}
return res;
}
}
1317.将整数转换为两个无零整数的和
分析
- 这个数对10取余,若余数为0,则说明它是10的倍数,一定含有0,不是无零整数,若不等于0,则除10之后再循环。
class Solution {
public int[] getNoZeroIntegers(int n) {
int[] res = new int[2];
for(int i = 1; i <= n / 2; i++) {
if(isNoZero(i) && isNoZero(n - i)) {
res[0] = i;
res[1] = n - i;
return res;
}
}
return res;
}
public boolean isNoZero(int n) {
while(n > 0) {
if(n % 10 == 0) return false; //若为0,则数是10的倍数,含有0
n = n / 10;//若不为0,则当前最低位不为0,除10判断下一位
}
return true;
}
}
1009.十进制整数的反码
分析
- 先计算N是几位二进制,再用同等长度的全1二进制与它异或,得到的即为N的反码
class Solution {
public int bitwiseComplement(int N) {
if(N == 0) return 1;
int num = N;
int len = 0;
while(num > 0) { //计算N得二进制长度
len++;
num = num >>> 1;
}
int temp = (1 << len) - 1; //产生长度相等的全1二进制
return N ^ temp; //两者异或
}
}