当前位置: 首页 > news >正文

2024.09.18 leetcode 每日一题

二进制求和

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

https://leetcode.cn/problems/add-binary/description/

代码一,尝试使用笨办法,会造成溢出

class Solution {
public:string addBinary(string a, string b) {int len1 = a.length();int len2 = b.length();long long  A=0;long long  B=0;for(int i=len1-1;i>=0;i--){A +=(a[i] - '0') *pow(2,len1-1-i);}for(int j=len2-1;j>=0;j--){B +=(b[j] - '0')*pow(2,len2-1-j);}long long C=A+B;if(C==0){string c="0";return c;}string c;while(C!=0){int m = C%2;  c+=(m+'0');C=C/2;}string reversed_c(c.rbegin(), c.rend());return reversed_c;}
};

注意,对于字符串的反转可以使用:

string reversed_c(c.rbegin(), c.rend());

按照这个思路,先对于ab字符串反转,然后按位相加,最后考虑进位问题,这个思路还是有点问题

看到一个大佬的题解

class Solution {
public:string addBinary(string a, string b) {if (b.size() > a.size()) {return addBinary(b, a);  // 这里先确保第一个数不短于第二个数}int m = a.size(), n = b.size(), carry = 0;for (int i = 0; i < m; i++) {if (n - 1 - i < 0) {if (carry == 0) break;} else {carry += b[n - 1 - i] - '0';}carry += a[m - 1 - i] - '0';a[m - 1 - i] = '0' + (carry % 2);carry >>= 1;}return carry ? '1' + a : a;}
};

函数分析

  • 首先进行长度比较,如果b的长度大于a的长度,就交换两个参数的位置,确保第一个参数(这里是a)不短于第二个参数。这样做是为了在后续的循环中简化处理,因为在处理时是以较长的字符串为基准进行遍历。
  • 然后确定两个字符串的长度mn,以及进位carry初始值为 0。
  • 接着进入循环,循环从长字符串a的最后一个字符开始向前遍历。
    • 如果当前索引对应的位置超出了短字符串b的范围,即n - 1 - i < 0,此时如果进位carry为 0,则说明没有更多的进位需要处理,可以直接跳出循环。
    • 如果当前索引对应的位置在短字符串b的范围内,则将短字符串b对应位置的字符值转换为数字(通过减去字符’0’)累加到进位carry中。
    • 同时,将长字符串a对应位置的字符值也转换为数字累加到进位carry中。
    • 然后更新长字符串a对应位置的字符为当前进位和的结果对 2 取余后再加上字符’0’,即得到该位置的新二进制值。
    • 最后更新进位carry为其当前值右移一位,相当于除以 2,以准备下一位的计算。
  • 循环结束后,如果进位carry不为 0,则在结果字符串a的前面添加一个字符’1’,表示最高位有进位;否则直接返回a作为最终的结果字符串。

下面是一种常规思路,上面的思路看不懂可以看下面这个

class Solution {
public:string addBinary(string a, string b) {int al = a.size();int bl = b.size();while(al < bl) //让两个字符串等长,若不等长,在短的字符串前补零,否则之后的操作会超出索引{a = '0' + a;++ al;}while(al > bl){b = '0' + b;++ bl;}for(int j = a.size() - 1; j > 0; -- j) //从后到前遍历所有的位数,同位相加{a[j] = a[j] - '0' + b[j];if(a[j] >=  '2') //若大于等于字符‘2’,需要进一{a[j] = (a[j] - '0') % 2 + '0';a[j-1] = a[j-1] + 1;}}a[0] = a[0] - '0' + b[0]; //将ab的第0位相加if(a[0] >= '2') //若大于等于2,需要进一{a[0] = (a[0] - '0') % 2 + '0';a = '1' + a;}return a;}
};
``

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 排序算法C++
  • AWS EKS 中的负载均衡和 TLS 配置:全面指南
  • Matplotlib-数据可视化详解
  • QT| QT配置CUDA
  • R语言APSIM模型进阶应用与参数优化、批量模拟实践技术
  • C++(学习)2024.9.23
  • ubuntu如何进行切换内核版本全教程
  • LLM - 理解 多模态大语言模型(MLLM) 的 幻觉(Hallucination) 与相关技术 (七)
  • leetcode91. 解码方法,动态规划
  • 最新Kali Linux超详细安装教程(附镜像包)
  • 『C/C++』整型和字符串相互转换
  • itextsharp报错 PdfReader not opened with owner password
  • 【51实物与仿真】基于51单片机设计的波形/函数发生器(正弦波、锯齿波、三角波、矩形波,设定频率步进值,改变振幅,LCD显示)——文末完整资料链接
  • python中数据处理库,机器学习库以及自动化与爬虫
  • flume系列之:出现数据堆积时临时增大sink端消费能力
  • es的写入过程
  • Median of Two Sorted Arrays
  • Python3爬取英雄联盟英雄皮肤大图
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 复习Javascript专题(四):js中的深浅拷贝
  • 关于extract.autodesk.io的一些说明
  • 理解在java “”i=i++;”所发生的事情
  • 如何设计一个微型分布式架构?
  • 深度学习在携程攻略社区的应用
  • 用 Swift 编写面向协议的视图
  • 栈实现走出迷宫(C++)
  • # 飞书APP集成平台-数字化落地
  • #define,static,const,三种常量的区别
  • #Lua:Lua调用C++生成的DLL库
  • (Charles)如何抓取手机http的报文
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (备忘)Java Map 遍历
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)计算机毕业设计高校学生选课系统
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (译)2019年前端性能优化清单 — 下篇
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)可以带来幸福的一本书
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .net操作Excel出错解决
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @ComponentScan比较
  • @Transaction注解失效的几种场景(附有示例代码)
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ solr入门 ] - 利用solrJ进行检索
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [AIGC] Redis基础命令集详细介绍
  • [Algorithm][综合训练][拜访][买卖股票的最好时机(四)]详细讲解
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [C#]科学计数法(scientific notation)显示为正常数字