题目描述:
给你一个整数 n
,以二进制字符串的形式返回该整数的 负二进制(base -2
)表示。
注意,除非字符串就是 "0"
,否则返回的字符串中不能含有前导零。
示例 1:
输入:n = 2 输出:"110" 解释:(-2)2 + (-2)1 = 2
示例 2:
输入:n = 3 输出:"111" 解释:(-2)2 + (-2)1 + (-2)0 = 3
示例 3:
输入:n = 4 输出:"100" 解释:(-2)2 = 4
提示:
0 <= n <= 109
题解:
模拟进位
首先我们可以先写出base为正数的二进制转换
class Solution {
public static final int base = 2;
public String baseNeg2(int n) {
String ans = "";
if(n == 0){
return "0";
}
while(n>0){
Integer r = n % base;
n /= base;
ans = r+ans;
}
return ans;
}
}
此时我们思考负二进制和二进制转换的区别,即
- 所得余数可能为负数
- 每次除base后n会改变正负
我们依次处理这两个问题
- r为负数的时候,r-=base后,r变为正数,此时我们需要在高位还1,即n++,这样我们就完成余数为负情况的处理
- 虽然n会变号,但是不影响循环,循环结束条件为n!=0即可
给出n = 3的模拟过程
r | 1 | -1 | 1 | 1 |
n | -1 | 0 | 1 | 0 |
红色处r为负数,此时我们可以变为绿色部分
最后附上代码
class Solution {
public static final int base = -2;
public String baseNeg2(int n) {
String ans = "";
if(n == 0){
return "0";
}
while(n!=0){
Integer r = n % base;
n /= base;
if(r < 0){
r -= base;
n++;
}
ans = r+ans;
}
return ans;
}
}