【面试经典150 | 位运算】二进制求和

news2024/11/27 3:45:41

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:模拟
  • 其他语言
    • c
  • 写在最后

Tag

【二进制】【位运算】


题目来源

67. 二进制求和


题目解读

以二进制字符串的形式返回两个二进制字符串的和。


解题思路

看到这个题目首先想到的方法可能是先把二进制字符转化成 int 型数字或者 long long 型数字,然后加和,最后将加和得到的结果再转化成二级制字符串。比如,将二进制字符串 "11" 转化成 3"10" 转化成 2,两个整数的和为 5,转会成二进制字符串为 101。该方法将我们不熟悉的二进制字符串加法转化成我们熟悉的整数的加法,对于部分数据的处理是没问题,但是处理较长的二进制字符串时,我们已知表示最大的整数类型的 long long(C/C++)都无法处理,会造成溢出的风险。

在 Python 和 Java 语言中,有一些可以表示更大数据的数据类型,该方法是可以实现,接下来主要是针对 C/C++ 语言中适用长度较大的字符串计算,接下来将要介绍的方法更具鲁棒性(Robust)。

方法一:模拟

平常我们接触的数多以十进制的形式存在,十进制的数之间的加法的计算规则是由低位到高位依次对齐,“逢十进一”。

在进行二进制数加法时可以参照十进制数的加法,由低位到高位依次对齐,不同于十进制的 “逢十进一”,二进制数加法是 “逢二进一”。

于是,计算二进制数加法时从最低位开始加,当两个数位之和等于 2 的时候就会产生进位,这个进位在下一位的两个数加和时要加上。进行对应位加法时,如果其中的一个字符已经遍历完毕,而另一个字符串还有二进制为没有遍历完,那么已经遍历完毕的二进制字符串要自动补零接着计算。按照这样的逻辑,于是有以下代码。

实现代码

class Solution {
public:
    string addBinary(string a, string b) {
        string ret;
        
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());
        
        int n = std::max(a.size(), b.size()), carry = 0;
        for(int i = 0; i < n; ++i){
            carry += (i < a.size()) ? (a.at(i) == '1') : 0;
            carry += (i < b.size()) ? (b.at(i) == '1') : 0;
            ret.push_back((carry % 2) ? '1' : '0');
            carry /= 2;
        }
        if(carry){
            ret.push_back('1');
        }
        reverse(ret.begin(), ret.end());
        return ret;
    }
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为字符串 ab 中的最大长度。

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

其他语言

c

// 反转字符串
void reverse(char* s) {
    int n = strlen(s);
    for (int i = 0; i < n / 2; ++i) {
        char t = s[i];
        s[i]= s[n - 1 -i];
        s[n - 1 - i] = t;
    }
}

char* addBinary(char* a, char* b) {
    reverse(a);
    reverse(b);
    int len_a = strlen(a), len_b = strlen(b);
    
    int n = fmax(len_a, len_b);
    int carry = 0, idx = 0;
    char* res = (char*)malloc(sizeof(char) * (n+2));
    for (int i = 0; i < n; ++i) {
        carry += i < len_a ? (a[i] == '1') : 0;
        carry += i < len_b ? (b[i] == '1') : 0;
        res[idx++] = carry % 2 + '0';
        carry /= 2;
    }
    if (carry) {
        res[idx++] = '1';
    }
    res[idx] = '\0';
    reverse(res);
    return res;
}

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

wvp-gb28181-pro接入海康摄像头

网络-高级配置-平台接入 sip服务器信息默认参数如下&#xff0c;一键安装wvp完成之后默认就是这样的参数 设置项 设置值 平台接入方式 28181 本地sip端口 5060 传输协议 tcp、udp&#xff08;外网的话我建议还是用tcp&#xff09; 启用 勾选 协议版本 GB/T28181-201…

使用Matplotlib绘画3D图时运行不出结果,也不报错,图片是空白 !!

1.问题&#xff1a; 我使用如下代码运用matplotlib中的Axes3D绘画3D图&#xff0c;但是运行出来的结果是空白。 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D #导入3D包 fig plt.figure() #窗口 #ax Axes3D(fig) # X, Y …

CSC公派遭美德拒签|计算机专业老师终赴意大利都灵理工大学访学

C老师拟申报CSC访学项目&#xff0c;希望先申请美国&#xff0c;并做好了一旦拒签再申请其它国家的心理准备。我们先用普渡大学的邀请函助其申报CSC&#xff0c;并顺利获批&#xff0c;但不出所料地被美国拒签了&#xff1b;很快又申请到德国奥芬堡应用技术大学&#xff0c;但不…

Mysql数据库 8.SQL语言 外键约束

一、外键约束 外键约束——将一个列添加外键约束与另一张表的主键&#xff08;唯一列&#xff09;进行关联之后&#xff0c;这个外键约束的列添加的数据必须要在关联的主键字段中存在 案例 创建原则&#xff1a;先创建不含外键的表也就是班级表 添加外键的方式 一般使用第一…

Go 跟踪函数调用链,理解代码更直观

Go 跟踪函数调用链&#xff0c;理解代码更直观 文章目录 Go 跟踪函数调用链&#xff0c;理解代码更直观一、引入二、自动获取所跟踪函数的函数名三、增加 Goroutine 标识四、让输出的跟踪信息更具层次感五、利用代码生成自动注入 Trace 函数5.1 将 Trace 函数放入一个独立的 mo…

day2 ARM基础

.text .globl _start _start:mov r0,#0 mov r1,#0 addfunc:add r0,r0,#1 r0自增1adds r1,r1,r0 R1实现1~100累加cmp r0,#100 判断r0是否到100bleq loop r0等于100 进入死循环 blne addfunc r0等于100跳转至循环累加 loop:b loopstop:b stop.end 【汇编…

win10语言切换调整为像win7一样,设置纯英文键盘切换,使用ctrol+shift切换键盘

文章目录 引入键盘布局说明安装美式键盘去掉微软键盘&#xff0c;修改布局切换快捷键最终效果 引入 我们在玩游戏或者写代码的时候&#xff0c;常常需要使用shift键&#xff0c;而输入法的shift键常常是中英切换按键&#xff0c;这就让人非常不爽了&#xff0c;这里仿照在win7…

JSP(Java Server Pages)

JSP 即 Java服务端页面。 其中既可以定义HTML、JS、CSS等静态内容&#xff0c;还可以定义Java代码的动态内容。也就是JSPHTML Java。 JSP代码简单例子&#xff1a; <html><head><title>Title</title></head><body><h1>JSP,Hello…

java入门,Map<? extends String, ?>

一、前言 是不是平时写业务代码的时候很少用到这个写法&#xff1a;Map<? extends String, ?>&#xff0c;这是Map类型&#xff0c;Map的键是? extends String 类型&#xff0c;值是?。为什么不是我们平时写的Map< String, Object>&#xff0c;这种写法有什么好…

Docker-compose容器群集编排管理工具

目录 Docker-compose 1、Docker-compose 的三大概念 2、YAML文件格式及编写注意事项 1&#xff09;使用 YAML 时需要注意下面事项 2&#xff09;ymal文件格式 3&#xff09;json格式 3、Docker Compose配置常用字段 4、Docker-compose的四种重启策略 5、Docker Compose…

【系统集成项目管理工程师】——5.计算

沟通&#xff1a;沟通渠道数n(n-1)/2&#xff0c;n代表人数 风险 三角分布: 期望[乐观 (小值) 最可能 (中值) 悲观 (大值) ]/3 贝塔分布:期望[乐观(小值) 4*最可能(中值) 悲观(大值) ]/6 标准差[悲观(大值)-乐观(小值) ]/6 方差[悲观 (大值) -乐观 (小值) ]^2/36 概率计算: 士…

DeepLearning - 余弦退火热重启学习率 CosineAnnealingWarmRestartsLR

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134249925 CosineAnnealingWarmRestartsLR&#xff0c;即 余弦退火热重启学习率&#xff0c;周期性修改学习率的下降和上升&#xff0c;间隔幅度逐…

SRAM之ECC检测机制

文章目录 前言一、SRAM简介1. RAM介绍2. SRAM介绍3. SRAM和DRAM的区别4. S32K146系列的SRAM5. LMEM 二、ECC1. EIM模块简介2. 操作步骤1&#xff09;定义反转的读取总线上的Bit&#xff08;Word1&#xff09;2&#xff09;定义反转的CheckBit总线上的Bit&#xff08;Word0&…

Sui浏览器现支持查看已验证的Move源代码

Sui浏览器现在包含了Sui框架包的源代码视图&#xff0c;这是一个备受欢迎的功能。这个新的“已验证源代码&#xff08;Source Verified&#xff09;”选项卡位于现有的“字节码&#xff08;Bytecode&#xff09;”选项卡旁边&#xff0c;使开发人员可以点击查看以下包的源代码&…

SBOM 指南: 是什么及其作用

在软件开发的动态格局中&#xff0c;过去十年见证了两次重新定义了行业轨迹的变革性转变。首先是广泛采用开源软件组件&#xff0c;为开发人员提供大量预先构建的模块&#xff0c;以简化他们的工作。第二个是与DevOps文化的拥抱&#xff0c;自动化和加速软件构建和交付过程。总…

UE5——源码阅读——8——引擎预初始化

初始化文本本地化 执行平台特定的初始化内容 执行应用程序的特定预初始化 将当前的工作目录设置为可执行的目录 处理命令行选项 启用内存保护&#xff08;根据命令行是否启用内存保护&#xff09; 是否启用UE5内存管理的炼狱测试 是否启用UE5内存中有问题的测试 添加bu…

sql中的加减乘除

自学SQL网(教程 视频 练习全套)

C++ PrimerPlus 复习 第九章 内存模型和名称空间

第一章 命令编译链接文件 make文件 第二章 进入c 第三章 处理数据 第四章 复合类型 &#xff08;上&#xff09; 第四章 复合类型 &#xff08;下&#xff09; 第五章 循环和关系表达式 第六章 分支语句和逻辑运算符 第七章 函数——C的编程模块&#xff08;上&#xff…

pandas - 数据分组统计

1.分组统计groupby()函数 对数据进行分组统计&#xff0c;主要适用DataFrame对象的groupby()函数。其功能如下。 &#xff08;1&#xff09;根据特定条件&#xff0c;将数据拆分成组 &#xff08;2&#xff09;每个组都可以独立应用函数&#xff08;如求和函数sum()&#xff0…

spark从0到1 基础知识 一文全

spark从0到1 基础知识 一文全 1 开发前准备2 spark架构&#xff0c;任务提交流程3 开发中涉及的python知识 学习中的测试学习代码详情代码请见本人github中的sparkcp项目 https://github.com/defineqq/sparkcp 1 开发前准备 主要是本机使用&#xff0c;所以 安装了个python3&a…