• 【算法】Convert to Base -2 负二进制转换


    Convert to Base -2 负二进制转换

    问题描述:

    给你一个整数 n ,以二进制字符串的形式返回该整数的 负二进制(base -2)表示。

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

    简单来说就是将一个十进制的n,转换成为负二进制的字符串。

    n范围[0,10^9]

    分析

    对于十进制的n来说,
    n = x 1 × ( 10 ) 0 + x 2 × ( 10 ) 1 + x 3 × ( 10 ) 2 + ⋯ + x i × ( 10 ) i − 1 n = x_1\times(10)^{0}+x_2\times(10)^{1}+x_3\times(10)^{2}+\dots+x_i\times(10)^{i-1} n=x1×(10)0+x2×(10)1+x3×(10)2++xi×(10)i1 ,而每一位的数字范围为0~9,其表示形式就是每一位都是 x i x_i xi x i x_i xi的范围[0,9].
    对于同样的数值来说,十进制和二进制,或者N进制,都是不同的表示形式,其最终所代表的数值,是相同的。
    所以以十进制的n来表示这样的数值,那么n的二进制 就是

    n = x 1 × ( 2 ) 0 + x 2 × ( 2 ) 1 + x 3 × ( 2 ) 2 + ⋯ + x i × ( 2 ) i − 1 n = x_1\times(2)^{0}+x_2\times(2)^{1}+x_3\times(2)^{2}+\dots+x_i\times(2)^{i-1} n=x1×(2)0+x2×(2)1+x3×(2)2++xi×(2)i1 变化的就是位权.
    因此将十进制转换为二进制,就是求余,因为2的特点,二进制每一位只会是0,1.具体写法可以百度.
    而十进制转换为x进制,其实与二进制相似, 用 c 表示x进制最低位的余数, n = X ∗ b + C n = X*b+C n=Xb+C. c的范围[0,x).*

    但是负进制需要特殊的 处理,n的负二进制, n = x 1 × ( − 2 ) 0 + x 2 × ( − 2 ) 1 + x 3 × ( − 2 ) 2 + ⋯ + x i × ( − 2 ) i − 1 n = x_1\times(-2)^{0}+x_2\times(-2)^{1}+x_3\times(-2)^{2}+\dots+x_i\times(-2)^{i-1} n=x1×(2)0+x2×(2)1+x3×(2)2++xi×(2)i1,
    n = ( − 2 ) ∗ b + c n = (-2)*b+c n=(2)b+c, b和c都是整数,对于负二进制来说,每一位上的数值范围(-2,0],即-1,0。但是由于编程语言不同其意义就相差甚远。
    在数学角度上模运算 X m o d    Y = X − Y × ⌊ X / Y ⌋ X \mod Y = X -Y\times\lfloor X/Y \rfloor XmodY=XY×X/Y,
    0 < x m o d    y < y , y > 0 0< x \mod y < y, y>0 0<xmody<y,y>0
    0 > x m o d    y > y , y < 0 0> x \mod y > y, y<0 0>xmody>y,y<0

    但是在JAVA中一般会使用%处理模运算,但这个运算符实际上是求余的,对于普通的场景下求余和求模的结果是一样的,但是类似这个问题中,y<0,%计算的结果就是-1,0,1。
    所以就需要特殊的处理。
    但是实际表示中不会用-1来表示,而是使用高位+1和当前位为1的组合表示。
    如果 c = − 1 , n = ( − 2 ) ∗ b + ( − 1 ) = > n = ( − 2 ) ∗ ( b + 1 ) + 1 c=-1, n = (-2)*b+(-1) => n = (-2)*(b+1)+1 c=1,n=(2)b+(1)=>n=(2)(b+1)+1,这个处理就是负X进制的区别。

    代码

    public String baseNeg2(int n) {
            if (n == 0) {
                return "0";
            } 
            int base = -2;
            StringBuilder sb = new StringBuilder();
            while(n!=0){            
                int r = n%base;                   
                String s = r==0?"0":"1";
                if(r!=0){                 
                    n-=1;
                }
                sb.append(s);            
                n/=-2;
            }
            int p = sb.length()-1;
            while(p>0&&sb.charAt(p)=='0') sb.deleteCharAt(p--);
            sb.reverse();
            return sb.toString();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    时间复杂度 O(N) 空间复杂度: O(1)

    Tag

    Array Math

  • 相关阅读:
    MyBatis 动态 SQL 实践教程
    【Ruoyi管理后台】用户登录强制修改密码
    【计算机网络】什么是WebSocket?
    论文速览【序列模型 seq2seq】—— 【Ptr-Net】Pointer Networks
    【效率提升】Edge浏览器
    零基础快速上手FFmpeg!一篇就够啦~
    中国xx集团信息技术工程师面试
    计算机网络 静态路由及动态路由RIP
    11、matlab将日期和字符串写入EXCEL,并将EXCEL数据读取另存为数字、元胞和结构体形式
    如何优雅的解决按钮“重复点击”问题(vue)
  • 原文地址:https://blog.csdn.net/edisonzhi/article/details/130857654