位运算,两种思路,LeetCode 1017. 负二进制转换

一、题目

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、原题链接

1017. 负二进制转换


二、解题报告

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";
    }
};
相关推荐
jerryinwuhan15 小时前
SVM案例分析
算法·机器学习·支持向量机
高山上有一只小老虎15 小时前
购物消费打折
java·算法
郝学胜-神的一滴16 小时前
计算机图形中的法线矩阵:深入理解与应用
开发语言·程序人生·线性代数·算法·机器学习·矩阵·个人开发
m0_5913389116 小时前
day8鹏哥C语言--函数
c语言·开发语言·算法
_OP_CHEN16 小时前
算法基础篇:(二)基础算法之高精度:突破数据极限
算法·acm·算法竞赛·高精度算法·oj题
一只老丸16 小时前
HOT100题打卡第30天——技巧
算法
Bi_BIT16 小时前
代码随想录训练营打卡Day38| 动态规划part06
算法·动态规划
手握风云-17 小时前
回溯剪枝的“减法艺术”:化解超时危机的 “救命稻草”(三)
算法·剪枝
元亓亓亓17 小时前
LeetCode热题100--46. 全排列--中等
算法·leetcode·职场和发展
墨染点香17 小时前
LeetCode 刷题【146. LRU 缓存】
leetcode·缓存·哈希算法