0
点赞
收藏
分享

微信扫一扫

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

有点d伤 2023-05-25 阅读 89
算法

文章目录

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();
    }

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

Tag

Array Math

举报

相关推荐

0 条评论