LeetCode1017题:负二进制转换(原创)

news2024/11/24 19:28:52

【题目描述】

        给你一个整数 n ,以二进制字符串的形式返回该整数的 负二进制(base -2)表示。注意,除非字符串就是 "0",否则返回的字符串中不能含有前导零。

示例 1:

输入:n = 2
输出:"110"
解释:(-2)2 + (-2)1 = 2

示例 2:

输入:n = 3
输出:"111"
解释:(-2)2 + (-2)1 + (-2)0 = 3

示例 3:

输入:n = 4
输出:"100"
解释:(-2)2 = 4

提示:

0 <= n <= 109

【题目链接】. - 力扣(LeetCode)

【解题代码】

package number;

public class BaseNeg2 {

    public static void main(String[] args) {
        System.out.println("计算结果:" + new BaseNeg2().baseNeg2(4));
    }

    public String baseNeg2(int n) {
        // 定义一个字符串生成器
        StringBuilder sb = new StringBuilder();
        // 当前数据总和
        int sum = 0;
        // 当前位数值
        int curDigitVal = 1;
        // 当前最高值
        int top = 2;
        while (true) {
            // 如果计入当前位数值,计算当前剩余数值
            int remaining = n - sum - curDigitVal;
            // 计算当前剩余数值是否合法:即目前后面位数不得为1
            if ((remaining & (top - 1)) == 0) {
                // 如果合法,计入当前位数值,字符串生成器加“1”
                sum += curDigitVal;
                sb.append(1);
            } else {
                // 如果不合法,计入当前位数值,字符串生成器加“0”
                sb.append(0);
            }
            // 如果当前数据总和等于目标值,跳出循环
            if (sum == n) {
                break;
            }
            // 当前负二进制位数左移1位
            curDigitVal *= -2;
            // 当前最高位左移1位
            top <<= 1;
        }

        return sb.reverse().toString();
    }
    
    // 第一次的老代码
    public String baseNeg21(int n) {
        StringBuilder sb = new StringBuilder();
        int sum = 0;
        int i = 0;
        while (true) {
            int curDigitVal = (int) Math.pow(-2, i++);
            int mask = (1 << i) - 1;
            int tmp = n - sum - curDigitVal;
            if (tmp % 2 == 0 && (tmp & mask) == 0) {
                sum += curDigitVal;
                sb.append(1);
            } else {
                sb.append(0);
            }
            if (sum == n) {
                break;
            }
        }

        return sb.reverse().toString();
    }
}

【解题思路】

        拿到题目第一眼感觉没有什么思路,于是看了下提示:

意思是根据提示可得知此题的关键点就在于检查当前负二进制位是否计入数值,然后再逐个左移检查,根据示例可以猜想出当前二进制位是否合理点:

  1. 目标值减去当前所有计入数值负二进制位之和的余数,能被2整除;
  2. 目标值减去当前所有计入数值负二进制位之和的余数,不可以包含低位2进制。因为往后添加的都是高位二进制;

按照这个思路很快写出代码,并提交成功

但运行结果执行用时分布是1MS,不是理想的0MS,应该哪里可以优化一下, 仔细检查了下代码,看到m,k等数值存在重复计算,于是又优化了一下。最终达到预计的0毫秒

【解题步骤】

  1. 定义字符串生成器,当前数据总和,当前位数值,当前最高值等变量;
    StringBuilder sb = new StringBuilder();
    int sum = 0;
    int curDigitVal = 1;
    int top = 2;
  2. 开启一个循环逐个检查当前负二进制位,计算出如果计入当前负二进制位数值,前剩余数值;
    while (true) {
        int remaining = n - sum - curDigitVal;
  3.  如果剩余数值合法,计入当前位数值,字符串生成器加“1”,否则字符串生成器加“0”
    if ((remaining & (top - 1)) == 0) {
        sum += curDigitVal;
        sb.append(1);
    } else {
        sb.append(0);
    }}
          
  4. 如果当前数据总和等于目标值,跳出循环
    if (sum == n) {
        break;
    }
  5. 当前负二进制位数左移1位,当前最高位左移1位
    curDigitVal *= -2;
    top <<= 1;
  6. 字符串生成器中逆序返回结果字符串 
     return sb.reverse().toString();

【思考总结】

  1. 此题解法的关键点就在于“目标值减去当前所有计入数值负二进制位之和的余数,不可以包含低位2进制”
  2. 程序员对于与、或、非、移位等这些位操作基本功一定要十分精通,了然于胸;
  3. 算法优化要精益求精:关键点要斤斤计较,拒绝重复计算;
  4. LeetCode解题之前,一定不要看题解,看了就“破功”了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1632832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习-N维数组和访问元素

目录 N维数组访问元素 N维数组 N维数组是机器学习和神经网络的主要数据结构 访问元素 最后一个子区域中的::是跳的意思&#xff0c;这个区域说明的是从第一个元素&#xff08;即第一行第一列那个&#xff09;对行开始跳3下循环下去直到行结束、对列开始跳2下循环下去直到列…

springboot拦载器

1、拦载器 package com.Interceptor;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.security.auth.login.Log…

如何快速申请SSL证书实现HTTPS访问?

申请SSL证书最简单的方法通常涉及以下几个步骤&#xff0c;尽量简化了操作流程和所需专业知识&#xff1a; 步骤一&#xff1a;选择适合的SSL证书类型 根据您的网站需求&#xff0c;选择最基础的域名验证型&#xff08;DV SSL&#xff09;证书&#xff0c;它通常只需验证域名所…

技术融合与创新大象机器人水星Mercury X1人形机器人案例研究!

引言 在科技迅速发展的当下&#xff0c;人形机器人正变得日益重要&#xff0c;其应用范围从工业自动化到服务业不断扩展。本文将通过Mercury X1大象人形机器人的案例&#xff0c;探讨如何利用尖端技术如大型语言模型&#xff08;LLM&#xff09;、同时定位与映射&#xff08;SL…

雅思(IELTS)优秀小作文分享

IELTS优秀小作文分享 柱状图 本篇范文个人评分是8分或者8.5分&#xff0c;属于能找到的最优质的范文了 题目如下: The two sets of bar charts illustrate the amount of time that teenagers (boys, girls, and all) in the UK spend chatting online and playing game c…

2024 java使用Graceful Response,告别自己去封装响应,可以接收数据异常,快看我这一篇,足够你用!

参考官网手册地址&#xff1a;快速入门 | Docs 一、导入依赖&#xff08;根据springboot查看对应依赖版本&#xff09; <!-- Graceful --><dependency><groupId>com.feiniaojin</groupId><artifactId>graceful-response</artifactId&g…

GaussDB数据库事务管理

一、引言 事务管理是数据库系统中至关重要的一部分&#xff0c;它确保了数据库的一致性和可靠性。在GaussDB数据库中&#xff0c;事务管理不仅遵循传统的ACID特性&#xff0c;还提供了一些高级功能。本文将深入探讨GaussDB数据库事务管理的各个方面。 二、事务的基本概念 2.1…

CSS Position定位(详解网页中的定位属性)

目录 一、Position介绍 1.概念 2.特点 3.作用 4.应用 二、Position用法 1.position属性 2.static定位 3.fixed定位 4.relative定位 5.absolute定位 6.sticky定位 7.重叠的元素 三、CSS定位属性 四、总结 一、Position介绍 1.概念 文档流&#xff08;Document Fl…

C++ 之 string类的模拟实现

这学习我有三不学 昨天不学&#xff0c;因为昨天是个过去 明天不学&#xff0c;因为明天还是个未知数 今天不学&#xff0c;因为我们要活在当下&#xff0c;我就是玩嘿嘿~ –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–…

springboot笔记一:idea社区版本创建springboot项目的方式

社区idea 手动maven 创建springboot项目 创建之后修改pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

Microsoft Edge浏览器:高效、简洁、个性化的网页浏览体验

Microsoft Edge是微软公司推出的一款网络浏览器&#xff0c;它是基于Chromium开源项目开发的&#xff0c;因此与Google Chrome有很多相似之处。以下是一些使用Microsoft Edge的心得体会&#xff1a; 1. 界面简洁&#xff1a;Microsoft Edge的界面设计非常简洁&#xff0c;用户…

R语言--图形绘制

一&#xff0c;绘制简单图形 c1<- c(10,20,30,40,50) c2<-c(2,7,15,40,50) plot(c1,c2,typeb) 具体参数请参考R语言中的绘图技巧1&#xff1a;plot()函数参数汇总_r语言plot参数设置-CSDN博客 c1<- c(10,20,30,40,50) c2<-c(2,7,15,40,50) plot(c1,c2,typeb,col#…

【北京迅为】《iTOP龙芯2K1000开发指南》-第四部分 ubuntu开发环境搭建

龙芯2K1000处理器集成2个64位GS264处理器核&#xff0c;主频1GHz&#xff0c;以及各种系统IO接口&#xff0c;集高性能与高配置于一身。支持4G模块、GPS模块、千兆以太网、16GB固态硬盘、双路UART、四路USB、WIFI蓝牙二合一模块、MiniPCIE等接口、双路CAN总线、RS485总线&#…

信息化还是数字化?

从 PC 互联网到移动互联网&#xff0c;再到物联网和最近流行的人工智能&#xff0c;科技的进步正在不断地改变着我们的生活和工作方式。这个过程实际上也是信息化和数字化的演进过程&#xff0c;许多人会问那信息化和数字化有啥区别&#xff1f;作为企业&#xff0c;如何在浪潮…

机器人操作系统ROS2学习—编译工作空间colcon build报错问题

在ROS2中&#xff0c;工作空间创建完成后&#xff0c;会经常需要编译工作空间。在工作空间dev_ws 下打开一个终端&#xff0c;通过指令Colcon build来编译工作空间。 1、这个过程有可能会出现如下错误: "colconbuild:Duplicate package names not supported" 根据…

openstack-自动化部署 9

所使用的kolla-ansible版本文档&#xff1a; Quick Start — kolla-ansible 14.10.1.dev21 documentation (openstack.org) 创建一个新的虚拟机 配置主机 安装docker 拉取openstack所需的组件镜像 安装ansible 配置ansible 启用lvm需要将另一个磁盘打成pv&#xff0c;以创建成…

如何与卫星影像叠加导出?

让每个人都有自己的地图&#xff01; 水经微图&#xff08;以下简称“微图”&#xff09;网页版&#xff0c;无需安装就可以绘制地图&#xff0c;得到了越来越多用户的亲睐。 但是&#xff0c;当我们千辛万苦绘制出来的地图&#xff0c;该如何与卫星影像叠加导出呢&#xff1…

【redis】Redis数据类型(一)——String类型(包含redis通用命令)

目录 Redis通用命令String类型常用的操作命令一些特殊命令详解setnx示例使用 setrange示例 mset示例 msetnx示例 append示例 getset示例 incr示例使用1.计数器2.限速器 bitcount示例使用&#xff1a;使用 bitmap 实现用户上线次数统计性能 String类型String类型简介String类型的…

Akamai 分布式“云+边缘”,打造下一代数字化基座

当下&#xff0c;数字化基础设施正逐步向分布式部署演化&#xff0c;云计算与边缘计算正在成为两大技术支柱。Gartner 数据显示&#xff0c;云服务占 IT 整体支出比例连年上涨&#xff0c;在过去一年已增长至12.1%&#xff1b;IDC 报告显示&#xff0c;截至2021年已有超过500亿…

【重磅开源】MapleBoot项目启动部署

基于SpringBootVue3开发的轻量级快速开发脚手架 &#x1f341;项目简介 一个通用的前、后端项目模板 一个快速开发管理系统的项目 一个可以生成SpringBootVue代码的项目 一个持续迭代的开源项目 一个程序员的心血合集 度过严寒&#xff0c;终有春日&#xff…