LeetCode: Add Binary
----- Условие ----- Даны две строки с двоичными числами. Требуется сложить их и вернуть результат в виде строки.
----- Решение ----- JavaScript позволяет быстро решить задачу через parseInt и toString. Но такое решение могут не принять на собеседовании. Реализуем через алгоритм.
1) Дополним более короткую строку нулями слева. Так мы сравняем их по длине для простой работы с индексами. 2) Инициализируем addForNextItem = 0 (число “в уме” для следующего разряда). 3) Пройдемся в цикле по строкам с конца, складывая значения и добавляя addForNextItem. Если сумма равна четному числу, то к результирующей строке добавляем слева 0, иначе 1. Если сумма больше 1, то addForNextItem = 1 (перенос разряда), иначе addForNextItem = 0. 4) Если addForNextItem равен 1 после цикла (есть неучтенный перенос разряда), то добавляем 1 в начало строки.
Сложность алгоритма по времени O(max(n, m)), где n и m - длины строк, сложность по памяти O(1).
----- Код ----- /** * @param {string} a * @param {string} b * @return {string} */ const addBinary = function(a, b) { if (a === ‘0’ && b === ‘0’) return ‘0’;
let ind = Math.max(a.length, b.length) - 1;
for (let i = 0; i < ind; i++) { if (a.length <= ind) a = ‘0’ + a; if (b.length <= ind) b = ‘0’ + b; }
let addForNextItem = 0; let sum = ‘’;
while (ind >= 0) { const itemA = Number(a[ind]) || 0; const itemB = Number(b[ind]) || 0; const res = addForNextItem + itemA + itemB;
sum = ((res === 0 || res === 2) ? ‘0’ : ‘1’) + sum; addForNextItem = res > 1 ? 1 : 0;
ind–; }
if (addForNextItem) sum = ‘1’ + sum;
return sum; };