【力扣LeetCode】 67二进制求和
- 第 127 篇 -
Date: 2025 - 09 - 23
Author: 郑龙浩(仟墨)
文章目录
- 【力扣LeetCode】 67二进制求和
- 题目描述
- 思路
- 代码
【力扣LeetCode】 67二进制求和
题目描述
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
思路
1 将两个字符串逆序存储到int类型的vector中(记得两个int的vector要统一长度,方便计算)
2 进行高精度加法求和运算,只是这次是二进制,%2或/2
3 将vector转换为string,并且是逆序存储的
4 返回string结果
代码
// 67_二进制求和
// Author: 郑龙浩 Date: 2025年09月16日
// 1 将两个字符串逆序存储到int类型的vector中(记得两个int的vector要统一长度,方便计算)
// 2 进行高精度加法求和运算,只是这次是二进制,%2或/2
// 3 将vector<int>转换为string,并且是逆序存储的
// 4 返回string结果
// 用时:40min
#include "bits/stdc++.h"
using namespace std;
class Solution {
public:string addBinary(string s1, string s2) {int max_len = max(s1.size(), s2.size()); // 最大长度, 统一长度,方便计算与维护vector <int> nums1(max_len);vector <int> nums2(max_len);// 将字符串逆序存储到nums里for (int i = s1.size()-1; i >= 0; i--) nums1[s1.size() - 1 - i] = s1[i] - '0';for (int i = s2.size()-1; i >= 0; i--) nums2[s2.size() - 1 - i] = s2[i] - '0';// 模拟竖式运算进行求和操作// 默认多加一位,位了避免最后一位需要进位,但是i+1越界的情况出现vector <int> ans(max_len + 1, 0); // 存放求和结果for (int i = 0; i < max_len; i++) {ans[i] += nums1[i] + nums2[i]; // 先加进去ans[i+1] += ans[i] / 2; // 进位操作ans[i] %= 2; // 只保留一位}// 如果多留出的一位没有用到(即最后一位没再向多留出一位进位的话,就将最后一位去掉if (ans[max_len] == 0) {ans.pop_back();}// 将逆序变为正序,并且写成string类型的数据string s_ans;for (auto it = ans.rbegin(); it != ans.rend(); it++) {s_ans += (*it) + '0';}return s_ans;}
};int main(void) {ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);string s1 = "11", s2 = "1";// string s1 = "1010", s2 = "1011";Solution sol;cout << sol.addBinary(s1, s2);return 0;
}