每日一練(39):二進位制求和
阿新 • • 發佈:2022-04-11
title: 每日一練(39):二進位制求和
categories:[劍指offer]
tags:[每日一練]
date: 2022/04/11
每日一練(39):二進位制求和
給你兩個二進位制字串,返回它們的和(用二進位制表示)。
輸入為 非空 字串且只包含數字 1 和 0。
示例 1:
輸入: a = "11", b = "1"
輸出: "100"
示例 2:
輸入: a = "1010", b = "1011"
輸出: "10101"
提示:
每個字串僅由字元 '0' 或 '1' 組成。
1 <= a.length, b.length <= 10^4
字串如果不是 "0" ,就都不含前導零。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/add-binary
方法一:模擬運算
思路分析
模擬直接計算,就是按照類似10進位制計算方式,考慮進位
string addBinary(string a, string b) { // 先倒序 reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); int na = a.size(); int nb = b.size(); int n = max(na, nb); string res = ""; int curr = 0; for (int i = 0; i < n; ++i) { curr += i < na ? a[i] == '1' : 0; curr += i < nb ? b[i] == '1' : 0; res.push_back(curr % 2 ? '1' : '0'); curr /= 2; } if (curr) { res.push_back('1'); } reverse(res.begin(), res.end()); return res; }
方法二:模擬運算優化(LeetCode英文網站大佬寫法)
思路分析
模擬直接計算,就是按照類似10進位制計算方式,考慮進位
string addBinary(string a, string b) { string s; s.reserve(a.size() + b.size()); int c = 0, i = a.size() - 1, j = b.size() - 1; while(i >= 0 || j >= 0 || c == 1) { c += i >= 0 ? a[i--] - '0' : 0; c += j >= 0 ? b[j--] - '0' : 0; s.push_back((c & 1) + '0'); c >>= 1; } reverse(s.begin(), s.end()); return s; }