列表

详情


1017. 负二进制转换

给出数字 N,返回由若干 "0" 和 "1"组成的字符串,该字符串为 N 的负二进制(base -2表示。

除非字符串就是 "0",否则返回的字符串中不能含有前导零。

 

示例 1:

输入:2
输出:"110"
解释:(-2) ^ 2 + (-2) ^ 1 = 2

示例 2:

输入:3
输出:"111"
解释:(-2) ^ 2 + (-2) ^ 1 + (-2) ^ 0 = 3

示例 3:

输入:4
输出:"100"
解释:(-2) ^ 2 = 4

 

提示:

  1. 0 <= N <= 10^9

相似题目

加密数字

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: string baseNeg2(int n) { } };

javascript 解法, 执行用时: 51 ms, 内存消耗: 49.2 MB, 提交时间: 2024-04-28 09:32:46

/**
 * @param {number} n
 * @return {string}
 */
var baseNeg2 = function(n) {
    if (n === 0 || n === 1) {
        return '' + n;
    }
    let res = '';
    while (n !== 0) {
        const remainder = n & 1;
        res += remainder;
        n -= remainder;
        n /= -2;
    }
    return res.split('').reverse().join('');
};

golang 解法, 执行用时: 0 ms, 内存消耗: 2 MB, 提交时间: 2024-04-28 09:32:33

// 进制转换
func baseNeg2(n int) string {
    if n == 0 || n == 1 {
        return strconv.Itoa(n)
    }
    res := []byte{}
    for n != 0 {
        remainder := n & 1
        res = append(res, '0'+byte(remainder))
        n -= remainder
        n /= -2
    }
    for i, n := 0, len(res); i < n/2; i++ {
        res[i], res[n-1-i] = res[n-1-i], res[i]
    }
    return string(res)
}

// 数学计算
func baseNeg2_2(n int) string {
    val := 0x55555555 ^ (0x55555555 - n)
    if val == 0 {
        return "0"
    }
    res := []byte{}
    for val > 0 {
        res = append(res, '0'+byte(val&1))
        val >>= 1
    }
    for i, n := 0, len(res); i < n/2; i++ {
        res[i], res[n-1-i] = res[n-1-i], res[i]
    }
    return string(res)
}

java 解法, 执行用时: 1 ms, 内存消耗: 39.1 MB, 提交时间: 2022-12-08 11:44:53

class Solution {
    public String baseNeg2(int N) {

        if(N == 0)
            return "0";
        
        String result = "";

        int n = N;
        while(n != 0) {
            if (n % 2 == 0) {
                result = "0" + result;
                n = n / (-2);
            } else {
                result = "1" + result;
                n = (n - 1) / (-2);
            }
        }

        return result;
    }
    
}

java 解法, 执行用时: 1 ms, 内存消耗: 39.1 MB, 提交时间: 2022-12-08 11:43:01

class Solution {
    public String baseNeg2(int N) {
        StringBuilder res = new StringBuilder();
        while (N != 0) {
            res.append(N & 1);
            N = -(N >> 1);
        }
        return res.length() > 0 ? res.reverse().toString() : "0";
    }
}

python3 解法, 执行用时: 36 ms, 内存消耗: 15 MB, 提交时间: 2022-12-08 11:42:32

class Solution:
    def baseNeg2(self, n: int) -> str:
        if not n: return '0'
        def dfs(cur):
            if cur == 0: return ''
            if cur & 1: # 是奇数的情况
                return dfs((cur - 1) // -2) + '1'
            else:
                return dfs(cur // -2) + '0'
        
        return dfs(n)

python3 解法, 执行用时: 36 ms, 内存消耗: 14.9 MB, 提交时间: 2022-12-08 11:41:34

class Solution:
    # 通过数学推导可以得到+K/-K进制的通用转化法
    def baseK(self, N, K):
        alphabet = "0123456789ABCDEF"
        if N == 0:
            return ["0"]
        res = []
        while N != 0:
            temp = ((N % K) + abs(K)) % abs(K)
            res.append(alphabet[temp])
            N -= temp
            N //= K
        return res[::-1]
    
    def baseNeg2(self, N: int) -> str:
        nums = self.baseK(N, -2)
        return "".join(nums)

cpp 解法, 执行用时: 0 ms, 内存消耗: 5.9 MB, 提交时间: 2022-12-08 11:41:01

class Solution {
public:
    // 无论K是正数还是负数都支持(只支持-10~10进制,因为更高进制需要引入字母)
    vector<int> baseK(int N, int K) {
        if (N == 0) return {0};
        vector<int> res;
        while (N != 0) {
            int r = ((N % K) + abs(K)) % abs(K); // 此处为关键
            res.push_back(r);
            N -= r;
            N /= K;
        }
        reverse(res.begin(), res.end());
        return res;
    }
    string baseNeg2(int N) {
        vector<int> nums = baseK(N, -2);
        string res;
        for (auto x : nums) res += to_string(x);
        return res;
    }
};

上一题