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

news/2025/1/11 18:03:48/

文章目录

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

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

Tag

Array Math


http://www.ppmy.cn/news/80601.html

相关文章

应用交付流程安全规范

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/130793290 一、平台安全使用规范 平台安全使用规范主要是规定平台层&#xff08;包括主机、Kubernetes集群&#xff09;的用户和文件权限及Kubernetes平台配置和使用规则。 如下所示&#xff1a; 类…

图像滤波概述

什么是图像滤波 1.图像滤波&#xff0c;即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制&#xff0c;是图像预处理中不可缺少的操作&#xff0c;其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 2.消除图像中的噪声成分叫作图像的平滑化或滤波操…

C++中string的用法

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;CSTL 前言&#xff1a;Hello各位小伙伴们好&#xff01;欢迎来到本专栏CSTL的学习&#xff0c;本专栏旨在帮助大家了解…

从 WebKit 看浏览器内核架构

浏览器常见的浏览器内核有&#xff1a;Blink、WebKit、Gecko、Trident 等&#xff0c;目前 WebKit 内核占据了非常大的的市场&#xff0c;包括 Chrome、Safari、安卓浏览器等市面上的主流浏览器&#xff0c;都使用了 WebKit 内核。 从 WebKit 看浏览器内核架构 既然 WebKit 这么…

LC-3 机器码编程实验

一、实验目的 分析和理解试验指定的需解决问题。利用LC-3的机器代码设计实现相关程序。通过LC-3仿真器调试和运行相关程序并得到正确的结果。 二、实验内容 利用LC-3的机器代码计算一个16位的字中有多少位是“1”&#xff0c;程序从x3000开始&#xff0c;需计算的字存储在x3…

【数据结构】树的认识

一个人的未来不是预测出来的&#xff0c;而是创造出来的。 -- 亚当詹姆斯目录 &#x1f341;前言&#xff1a; &#x1f340;一.什么是树&#xff1f; &#x1f351;二.树有什么用&#xff1f; ❤️1. 数据库 &#x1f9e1;2. 文件系统 &#x1…

分享一些冷门好用的网站和软件

分享一&#xff1a;UZER UZER是一个功能强大的云端应用空间&#xff0c;可以帮助您将所有的文件和应用程序都集中在一个地方&#xff0c;让您随时随地轻松访问。 以下是它的主要特点&#xff1a; 云存储&#xff1a;UZER提供大量的云存储空间&#xff0c;让您可以安全地存储…

【MySQL】- 01 MySQL范式

MySQL系列第一篇 后续大概有20篇左右&#xff0c;包含基础架构、强化、优化原理、进阶等等模块 MySQL范式 Mysql数据库范式第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09;巴斯-科德范式&#xff08;BCNF&#x…