【进制转换】和2进制相比的话,偶数位是完全相同的,但是奇数位是由当前位和当前位 + 1 一起组成的。所以当遇到奇数位的时候该位为1,同时需要加上该位的值,然后继续向前转成 -2 进制。
class Solution {
public String baseNeg2(int n) {
// 1 -2 4 -8 16
// 0 1
if (n == 0) return "0";
StringBuilder sb = new StringBuilder();
int i = 0;
while (n != 0) {
if (n % 2 == 1) {
if (i % 2 == 0) sb.append("1");
else {
sb.append("1");
n += 1;
}
} else sb.append("0");
n /= 2;
i++;
}
sb.reverse();
return sb.toString();
}
}
【背包问题】也可以当成背包问题来看,因为有负的,所以一开始把负的都加入到n中,也就是才开始把负的都加入背包,然后从大到小枚举物品(1 >> i),如果当前 n >= 这个值,那么根据 i 的奇偶性选择是加入背包还是拿出背包。
class Solution {
public String baseNeg2(int n) {
// 1 -2 4 -8 16
// 0 1
if (n == 0) return "0";
int sum = n;
for (int i = 1; i <= 30; i += 2) sum += 1 << i;
// System.out.println(sum);
StringBuilder sb = new StringBuilder();
for (int i = 30; i >= 0; i--) {
if (sum >= (1 << i)) {
if (i % 2 == 1) sb.append("0");
else sb.append("1");
sum -= 1 << i;
} else {
if (i % 2 == 1) sb.append("1");
else sb.append("0");
}
}
boolean st = false;
StringBuilder ans = new StringBuilder();
for (int i = 0; i <= 30; i++) {
if (sb.charAt(i) == '1') {
st = true;
}
if (st) ans.append(sb.charAt(i));
}
return ans.toString();
}
}