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

【题目描述】

        给你一个整数 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解题之前,一定不要看题解,看了就“破功”了!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高频面试题:解决Spring框架中的循环依赖问题

引言&#xff1a;什么是Spring框架与循环依赖&#xff1f; 在Spring框架中&#xff0c;循环依赖是指两个或多个bean相互依赖对方以完成自己的初始化。这种依赖关系形成了一个闭环&#xff0c;导致无法顺利完成依赖注入。比如&#xff0c;如果Bean A在其构造函数中需要Bean B&a…

图像处理:乘法滤波器(Multiplying Filter)和逆FFT位移

一、乘法滤波器&#xff08;Multiplying Filter&#xff09; 乘法滤波器是一种以像素值为权重的滤波器&#xff0c;它通过将滤波器的权重与图像的像素值相乘&#xff0c;来获得滤波后的像素值。具体地&#xff0c;假设乘法滤波器的权重为h(i,j)&#xff0c;图像的像素值为f(m,…

基于51单片机的电子秤LCD1602液晶显示( proteus仿真+程序+设计报告+讲解视频)

基于51单片机电子秤LCD显示 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真设计4. 程序代码5. 设计报告6. 设计资料内容清单&&下载链接 基于51单片机电子秤LCD显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus8.9及以上 程序编译器&#xf…

NiceGUI:一个超赞的Python UI库

1. 引言 NiceGUI是一个基于Python的简单用户界面框架&#xff0c;可与浏览器或桌面应用程序流畅运行。无论你是制作小型网络应用程序、还是玩机器人项目&#xff0c;NiceGUI 都能以其简单的界面和众多的功能满足你的需求。这篇文章的目的是通过向大家展示如何构建和部署NiceGU…

如何选择适合自己需求的DC电源模块?

BOSHIDA 如何选择适合自己需求的DC电源模块&#xff1f; 在选择适合自己需求的DC电源模块时&#xff0c;需要考虑一些关键因素&#xff0c;以确保选择的模块能够满足电源要求并具有良好的性能。下面是一些值得考虑的因素&#xff1a; 1. 电压输出范围&#xff1a;首先&#xf…

短视频素材从哪里获取?推荐8个短视频素材高清网站

在这个视觉内容至关重要的数字化时代&#xff0c;高质量的视频素材是任何成功视频项目的核心。无论是加强品牌宣传、提升社交媒体互动还是制作引人注目的广告&#xff0c;这些精选的全球视频素材网站都将为你的创意注入活力&#xff0c;帮助你在激烈的市场竞争中脱颖而出。 1.…

2024LarkXR新增功能系列之六 | ⽀持8K分辨率

Paraverse平行云企业级实时云渲染解决方案LarkXR是平行云自主研发的CloudXR解决方案&#xff0c;在业界实现了创新突破。通过分钟级部署大规模云端资源、高度适配XR所有主流引擎、以及灵活支持不同交互和沉浸方式的内容形式&#xff0c;LarkXR解决了Cloud XR商业化过程中所面临…

Linux之进程间通信(二)

system V system V共享内存是内核中专门设计的通信的方式, 粗粒度划分操作系统分为进程管理, 内存管理, 文件系统, 驱动管理.., 粒度更细地分还有 进程间通信模块. 对于操作系统, 通信的场景有很多, 有以传送数据, 快速传送数据, 传送特定数据块, 进程间协同与控制以目的, 它…

SystemUI GlobalActions plugin解析

com.android.systemui.action.PLUGIN_GLOBAL_ACTIONS 系统的默认实现为GlobalActionsImpl: 是谁发送了showShutdownUi指令&#xff1f; GlobalActionsImpl 是通过inject的方式创建的 GlobalActionsComponent是一个system UI services&#xff0c;配置在config.xml中&#xff…

Docker容器:网络模式与资源控制

目录 一、Docker 网络模式 1、Docker 网络实现原理 2、Docker 网络模式概述 2.1 Host 模式 2.2 Container 模式 2.3 None 模式 2.4 Bridge 模式 2.5 自定义网络&#xff08;user-defined network&#xff09; 3、配置 docker 网络模式 3.1 查看网络基础命令 3.1.1 查…

“怡宝”冲刺港股,饮用水基本盘稳如磐石

最近&#xff0c;饮用水市场异常热闹。 先是“怡宝”所属的华润饮料正式向港交所提交上市申请。随即&#xff0c;多名农夫山泉员工在朋友圈发文“推出绿瓶纯净水”&#xff0c;撞脸怡宝经典包装。“怡宝”遭遇奇袭的背后&#xff0c;是双方持续“交锋”的多年&#xff0c;随着…

Vue从入门到精通-01-Vue的介绍和vue-cli

MVVM模式 Model&#xff1a;负责数据存储 View&#xff1a;负责页面展示 View Model&#xff1a;负责业务逻辑处理&#xff08;比如Ajax请求等&#xff09;&#xff0c;对数据进行加工后交给视图展示 关于框架 为什么要学习流行框架 1、企业为了提高开发效率&#xff1a;…

【Harmony3.1/4.0】笔记三-计算器

概念 网格布局是由“行”和“列”分割的单元格所组成&#xff0c;通过指定“项目”所在的单元格做出各种各样的布局。网格布局具有较强的页面均分能力&#xff0c;子组件占比控制能力&#xff0c;是一种重要自适应布局&#xff0c;其使用场景有九宫格图片展示、日历、计算器等…

python-pytorch 如何使用python库Netron查看模型结构(以pytorch官网模型为例)0.9.2

Netron查看模型结构 参照模型安装Netron写netron代码运行查看结果需要关注的地方 2024年4月27日14:32:30----0.9.2 参照模型 以pytorch官网的tutorial为观察对象&#xff0c;链接是https://pytorch.org/tutorials/intermediate/char_rnn_classification_tutorial.html 模型代…

基于Springboot的新生宿舍管理系统

基于SpringbootVue的新生宿舍管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 公告信息管理 院系管理 班级管理 学生管理 宿舍信息管理 宿舍安排管理…

清华军团推出中国首个对标Sora的视频大模型Vidu,扒一扒它背后的模型架构

就在前天&#xff0c;Vidu 在 2024 中关村论坛年会之中横空出世。 伴随着“中国首个”&#xff0c;“Sora 级视频模型”&#xff0c;“模拟真实的物理世界”等关键词下的刷屏式的报道&#xff0c;Vidu 一下成为国产视频模型的一剂强心针。 尽管目前 Vidu 支持的视频长度是 16 …

二叉树理论和题目

二叉树的种类 在我们解题过程中二叉树有两种主要的形&#xff1a;满二叉树和完全二叉树。 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为 2 的结点&#xff0c;并且度为 0 的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 这棵二叉树为满二叉树…

vscode的终端区乱码怎么办呢?

vscode的终端区乱码怎么办呢? 错误效果解决办法一解决办法二(极力推荐方法二)最终效果参考文献 错误效果 解决办法一 解释:你之所以使用了utf8还乱码,是因为你的电脑目前根本无法兼容utf8,只兼容gbk 怎么让你的电脑兼容utf8,我写在方法二 在设置中,输入encoding 解决办法二(极…

水稻病害检测(YOLO数据集,多分类,稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫)

是自己利用LabelImg工具进行手工标注&#xff0c;数据集制作不易&#xff0c;请尊重版权&#xff08;稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫&#xff09; 如果需要yolv8检测模型和数据集放在一起的压缩包&#xff0c;可以关注&#xff1a;最新最…

求解约瑟夫问题

思路&#xff1a; 我们要创建两个指针 有一个指针pcur指向头结点&#xff0c;该pcur作为报数的指针&#xff0c;还有一个指针ptail指向尾结点&#xff0c;作为记录pcur的地址 每报数为m时&#xff0c;pcur指向下一个元素的地址&#xff0c;ptail销毁报数为m的地址&#xff0…