一、题目
1、题目描述
给你一个整数
n
,以二进制字符串的形式返回该整数的 **负二进制(base -2
)**表示。注意, 除非字符串就是
"0"
,否则返回的字符串中不能含有前导零。
2、接口描述
python3
python
class Solution:
def baseNeg2(self, n: int) -> str:
cpp
cpp
class Solution {
public:
string baseNeg2(int n) {
}
};
3、原题链接
二、解题报告
1、思路分析
F1 二进制拆分
我们如果要用2进制位凑出n,那么从地位到高位进行枚举,能加入就加入
现在变成了-2 进制,对于偶数位没有影响,对于奇数位,(-2) ^ k = - (2 ^ k) = 2(k + 1) - 2 ^ k
那么对于奇数位,我们加上该位的同时令n加上 2 ^ (k + 1)即可
F2 进制转换
进制转换的通用方法:
加入余数,原数 -= 余数,原数除以 base
2、复杂度
时间复杂度: O(logn) 空间复杂度:O(1)
3、代码详解
F1 二进制拆分
python3
python
base = -2
class Solution:
def baseNeg2(self, n: int) -> str:
if not n:
return "0"
ret = []
i = 0
while n:
ret.append(str(n & 1))
if i & 1:
n += 2 if n & 1 else 0
n //= 2
i += 1
return "".join(ret[::-1])
cpp
cpp
class Solution {
public:
string baseNeg2(int n) {
string ret;
for(int i = 0; n; i ++){
ret.push_back(abs(n & 1) ^ 48);
if(i & 1) n += (n & 1) << 1;
n >>= 1;
}
reverse(ret.begin(), ret.end());
return ret.size() ? ret : "0";
}
};
F2 进制转换
python3
python
base = -2
class Solution:
def baseNeg2(self, n: int) -> str:
if not n:
return "0"
ret = []
while n:
ret.append(str(n & 1))
n = n // base + (1 if (n % base) < 0 else 0)
return "".join(ret[::-1])
cpp
cpp
class Solution {
public:
static constexpr int base = -2;
string baseNeg2(int n) {
string ret;
while(n){
ret.push_back(abs(n % base) ^ 48);
n = n / base + ((n % base) < 0);
}
reverse(ret.begin(), ret.end());
return ret.size() ? ret : "0";
}
};