2024.09.18 leetcode 每日一题

devtools/2024/9/23 23:28:24/

二进制求和

给你两个二进制字符串 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;}
};
``

http://www.ppmy.cn/devtools/116230.html

相关文章

使用express或koa或nginx部署history路由模式的单页面应用

使用hash模式会有#&#xff0c;影响美观&#xff0c;所以使用history模式会是个更好的选择。 前端项目打包上线部署&#xff0c;可以使用下面的方式部署history模式的项目&#xff0c;下面以 jyH5 为例 expressjs部署 express脚手架搭建的app.js中添加如下代码&#xff1a; …

一些常用的 Docker 命令

一些常用的 Docker 命令 涵盖了查看镜像、启动镜像等基本操作&#xff1a; 1. 查看 Docker 镜像 列出所有本地存储的镜像&#xff1a; docker images这会显示所有已经下载到本地的镜像&#xff0c;包括仓库名、标签、镜像 ID、创建时间和大小。 2. 拉取 Docker 镜像 从 Dock…

代码随想录八股训练营第四十天| C++

目录 一、什么是菱形继承&#xff1f; 1.1.菱形继承的示例: 1.2.菱形继承的问题&#xff1a; 1.3.解决菱形继承问题&#xff1a; 二、C中的多线程同步机制&#xff1f; 2.1.互斥锁&#xff08;Mutex&#xff09;: 2.2.递归互斥锁&#xff08;Recursive Mutex&#xff09…

Docker学习笔记(三)存储与卷

挂载机制介绍 我们都知道&#xff0c;默认下&#xff0c;Docker容器与宿主机是完全隔离的&#xff0c;这种特性使得我们创建与删除容器都变得更方便&#xff0c;不需要再去删除宿主机上容器遗留下来的痕迹。   但是&#xff0c;当我们使用数据库一类需要持久化数据、共享数据…

渗透测试入门学习——php表单form与POST、GET请求练习

最终效果&#xff1a; 必填项为空报错提示&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>php表单练习</title> </head> <body> <?php//php中的…

Qt 类型选择器和类选择器的区别

概念上的区别请查看此篇博客&#xff1a;Qt 样式表、选择器、盒子模型&#xff0c;下面我直接举例说明。 示例界面&#xff1a; 1、类型选择器&#xff1a; QWidget {background-color: rgb(255, 85, 127); }运行结果&#xff08;因为QPushButton是QWidget的子类&#xff0…

代码随想录算法训练营第3天|链表理论基础、203. 移除链表元素、 707.设计链表、 206.反转链表

目录 链表理论基础203. 移除链表元素1、题目描述2、思路3、code4、复杂度分析 707. 设计链表1、题目描述2、思路3、code 206. 反转链表1、题目描述2、思路3、code4、复杂度分析 链表理论基础 ❤️链表增删的时间复杂度都是 O ( 1 ) O(1) O(1)&#xff0c;适合动态增删&#xf…

python CRC16校验

python openmv 串口 crc16校验 class byte:def __init__(self,word):self.word wordself.low self.word & 0xffself.high self.word >> 8auchCRCHi [0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC…