[每日一题] 106. 二进制求和(字符串、数学)
1. 题目来源
链接:二进制求和
来源:LeetCode
2. 题目说明
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例1:
输入: a = “11”, b = “1”
输出: “100”
示例2:
输入: a = “1010”, b = “1011”
输出: “10101”
3. 题目解析
思路分析
二进制求和,满二进一
- 首先让两个字符串等长,若不等长,在短的字符串前补零,否则之后的操作会超出索引。
- 然后从后到前遍历所有的位数,同位相加,这里有一个点,用的是字符相加,利用 ASCII 码,字符在内部都用数字表示,我们不需要知道具体数值,但可知 ‘0’-‘0’ = ‘0’, ‘0’+1=‘1’,以此类推 。字符的加减,大小比较,实际上都是内部数字的加减,大小比较。
- 判断相加后的字符,若大于等于字符 ‘2’,下一位需要进一。
- 第 0 位数的相加在这里是单独处理的,因为它可能涉及到字符的插入,即是否需要在最前面加一位数 ‘1’。
4. 代码展示
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;}
};
第一遍的笨笨写法:
class Solution {public:string addBinary(string a, string b) {int alen = a.length();int blen = b.length();int length = 0;int cnt = 0;int cnt1 = 0;int flag = 0;if (alen > blen) {cnt = alen - blen;cnt1 = cnt;flag = 1;while (cnt) {b.push_back('0');--cnt;}}if (alen < blen) {cnt = blen - alen;cnt1 = cnt;flag = 2;while (cnt) {a.push_back('0');--cnt;}}if (alen == blen) flag = 3;if (flag == 1) {length = alen;}if (flag == 2 || flag == 3) {length = blen;}vector<int> vta(length, 0);vector<int> vtb(length, 0);vector<int> vt(length, 0);int flag2 = 0;for (int i = 0; i < vta.size(); ++i) {vta[i] = a[i] - '0';}for (int i = 0; i < vtb.size(); ++i) {vtb[i] = b[i] - '0';}if (flag == 1) {for (int i = vtb.size() - 1; i >= cnt1; --i) {vtb[i] = vtb[i - cnt1];}for (int i = 0; i < cnt1; ++i) {vtb[i] = 0;}}if (flag == 2) {for (int i = vta.size() - 1; i >= cnt1; --i) {vta[i] = vta[i - cnt1];}for (int i = 0; i < cnt1; ++i) {vta[i] = 0;}}for (int i = 0; i < vt.size(); ++i) {vt[i] = vta[i] + vtb[i];}reverse(vt.begin(), vt.end());vt.push_back(0);for (int i = 0; i < vt.size(); ++i) {if (vt[i] == 2) {vt[i] = 0;vt[i + 1] += 1;}if (vt[i] == 3) {vt[i] = 1;vt[i + 1] += 1;}}if (vt[vt.size() - 1] == 0) vt.pop_back();reverse(vt.begin(), vt.end());string str(vt.size(), '0');for (int i = 0; i < vt.size(); ++i) {if (vt[i] == 0) str[i] = '0';else str[i] = '1';}return str;}
};
没有精简代码,顺了一遍思路直接开码…整了这么多变量…
[每日一题] 106. 二进制求和(字符串、数学)相关推荐
- LeetCode每日一题——1684. 统计一致字符串的数目
LeetCode每日一题系列 题目:1684. 统计一致字符串的数目 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个由不同字符组成的字符串 allowed ...
- 【Python】青少年蓝桥杯_每日一题_12.03_输出字符串的长度
用心写好每一篇文章 一.题目背景 本题是Python编程问题,出现在2020年9月的STEMA考试中. 二.编程实现 输入一个字符串(N),输出该字符串的长度. 输入描述:输入一个字符串N 输出描述: ...
- 【Python】青少年蓝桥杯_每日一题_1.03_输出字符串
用心写好每一篇文章 一.编程实现 输入一个字符串,然后将这个字符串输出. 输入描述:输入一个字符串 输出描述:输出这个字符串 样例输入: abc 样例输出: abc 二.评分标准 6分:能正确输出一组 ...
- LeetCode 题 - 67. 二进制求和 python实现
题目 给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" ...
- 学渣的刷题之旅 leetcode刷题 67.二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 输入: a = "11", b = "1" 输出: " ...
- LeetCode 每日一题——1684. 统计一致字符串的数目
1.题目描述 1684. 统计一致字符串的数目 给你一个由不同字符组成的字符串 allowed 和一个字符串数组 words .如果一个字符串的每一个字符都在 allowed 中,就称这个字符串是 一 ...
- 每日一题(40)—— 字符串常量
下列代码有什么问题? char* s="AAA"; printf("%s",s); s[0]='B'; printf("%s",s); &q ...
- 【Java每日一题,Map和字符串】Ananagrams
Introduction 输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本的另外一个单词.在判断是否满足条件时,字母不分大小写,但在输出时应保留输入的大小写,按字典序排列 ...
- 【每日一题】旋变字符串
" 一个字符串可以分解成多种二叉树结构.如果 str 长度为 1 ,认为不可分解.如果 str 长度为 N(N > 1),左部分长度可 以为 1 ~ N - 1,剩下的为右部分的长度. ...
最新文章
- fft 相位谱_信号处理之功率谱原理与python实现
- ZooKeeper Watch Java API浅析getChildren
- linux 定时清理tomcat日志
- php异常处理示例,php异常处理示例
- linux(3):Linux MBR分区、挂载操作步骤,逻辑卷扩容操作
- Python——正则表达式特殊符号及用法
- SAP License:SAP S/4HANA Cloud [ERP 云]
- Java学习目录(持续更新中)
- Ubuntu 10.04的安装
- 100部超级好电影,100组优秀的字体设计(不看后悔系列)
- LeaRun低代码开发平台 助推物联网应用快速落地
- R语言中的if-else语句写法
- 弹出USB大容量存储设备时出问题的解决方案
- /Users/apple/.zshrc:2: command not found: i 终端报错解决方法
- 英文论文写作注意事项整理
- 博士毕业论文英文参考文献换行_如何赏心悦目的翻译英文文献全文
- js学到什么程度学框架_如何学到什么
- pytorch的expand_as和expand
- 《程序员》特别策划:论托普的“倒掉”
- im2bw函数的用法