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; };