LeetCode 每日一题 ---- 【1017.负二进制转换】

LeetCode 每日一题 ---- 【1017.负二进制转换】

1017.负二进制转换

方法一:模拟进制转换

我们平常做进制转换最常用的方法就是辗转相除法,下面的图示分别给出了普通的10进制转2进制的过程,和10进制转 -2进制的过程
在这里插入图片描述

这里我们来推导一下右边的计算过程的合规性。
我们设 被除数为a,除数为b,余数为c
则有 a = (-2) * b + c,当余数c等于 -1 时,那么我们就不好表示了,我们就可以在这里变形:

a = (-2) * b + c
a - (-2) * b = c
a - (-2) * b + 2 = c + 2
a - (-2) * (b + 1) = c + 2

当c == -1时,我们可以加2,转换为1,然后将辗转相除得到的b的值加1,然后继续做辗转相除的运算操作。

class Solution {
    public String baseNeg2(int n) {
        if (n == 0 || n == 1) return String.valueOf(n);
        StringBuilder sb = new StringBuilder();
        while (n != 0) {
            int mod = n % (-2);
            n /= -2;
            if (mod == -1) {
                sb.append(1);
                n ++ ;
            } else {
                sb.append(mod);
            }
        }
        return sb.reverse().toString();
    }
}

推广:任意进制转换

依据上面的逻辑,这个解题逻辑是可以推广到任意进制的,我们设进制为k,则我们我们辗转相除的时候,如果余数小于0,则余数- k(此时k是负数),商 + 1即可。

class Solution {
    public String baseNeg2(int n) {
        if (n == 0) {
            return "0";
        }
        int k = -2;
        int x = n;
        StringBuilder sb = new StringBuilder();
        while (x != 0) {
            int mod = x % k;
            x /= k;
            if (mod < 0) {
                // 修正一下
                sb.append(mod - k);
                ++x;
            } else {
                sb.append(mod);
            } 
        }
        return sb.reverse().toString();
    }
}

时间复杂度:
O(logn)

空间复杂度:
O(1)

相关推荐

  1. LeetCode每日 - 二进制转化

    2024-04-29 21:40:02       13 阅读
  2. 2024.4.28力扣每日——二进制转换

    2024-04-29 21:40:02       12 阅读
  3. 二进制转换

    2024-04-29 21:40:02       17 阅读
  4. LeetCode每日】2864. 最大二进制奇数

    2024-04-29 21:40:02       22 阅读
  5. 每日-二进制求和

    2024-04-29 21:40:02       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-29 21:40:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-29 21:40:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-29 21:40:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-29 21:40:02       20 阅读

热门阅读

  1. 使用python写一个识别人脸

    2024-04-29 21:40:02       11 阅读
  2. C#面:委托是什么?事件是不是一种委托?

    2024-04-29 21:40:02       15 阅读
  3. 2d激光slam的改进方案探索

    2024-04-29 21:40:02       12 阅读
  4. C/C++中的整数乘法运算与汇编指令MUL和IMUL

    2024-04-29 21:40:02       13 阅读
  5. 内核镜像

    2024-04-29 21:40:02       13 阅读
  6. 常用的网站和软件

    2024-04-29 21:40:02       14 阅读
  7. 发现问题并进行管理——bug和调试器

    2024-04-29 21:40:02       15 阅读
  8. vue源码中如何实现数据监听?

    2024-04-29 21:40:02       14 阅读
  9. 反射会打破单例模式吗

    2024-04-29 21:40:02       15 阅读
  10. C语言十进制转十六进制

    2024-04-29 21:40:02       11 阅读
  11. 使用Docker搭建Nacos集群

    2024-04-29 21:40:02       12 阅读
  12. 这款永久免费云服务器实在是太好用了

    2024-04-29 21:40:02       16 阅读
  13. Meta大佬亲授LLaMA 3的奥秘

    2024-04-29 21:40:02       12 阅读
  14. cpp程序优化

    2024-04-29 21:40:02       12 阅读