LeetCode - add binary

katanazero·2020년 6월 8일
0

leetcode

목록 보기
10/13
post-thumbnail

add binary

  • Difficulty : easy

Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1 or 0.

  • 2개의 이진수 문자열이 주어지며 이 이진수를 합해서 문자열로 반환

example
Example 1:
Input: a = "11", b = "1"
Output: "100"

Example 2:
Input: a = "1010", b = "1011"
Output: "10101"

Constraints:

  • Each string consists only of '0' or '1' characters.
  • 1 <= a.length, b.length <= 10^4
  • Each string is either "0" or doesn't contain any leading zero.

solution

  • 작성 언어 : javascript
  • Runtime : 80ms
/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function(a, b) {

  let result = [];
  let carryNum = 0;

  while (true) {

    let aLastIndex = a.length - 1;
    let bLastIndex = b.length - 1;

    if (aLastIndex != -1 || bLastIndex != -1) {

      let aNum = Number(a[aLastIndex] ? a[aLastIndex] : 0);
      let bNum = Number(b[bLastIndex] ? b[bLastIndex] : 0);

      if (aNum + bNum + carryNum > 1) {
        if (aNum + bNum + carryNum == 2) {
          result.unshift(0);
        }

        if (aNum + bNum + carryNum == 3) {
          result.unshift(1);
        }

        carryNum = 1;

      } else {
        result.unshift(aNum + bNum + carryNum);
        carryNum = 0;
      }

    }

    if (aLastIndex == -1 && bLastIndex == -1) {

      if (carryNum == 1) {
        result.unshift(carryNum);
      }

      return result.join('');
    }

    a = a.substring(0, aLastIndex);
    b = b.substring(0, bLastIndex);

  }


};

  • 전에 한번 풀었는데, 또 어렵게 접근을 하였다 -_-;;
  • 이진수를 더하는건데, 올림수를 잘 핸들링하면 된다.
  • 더해서 2가 되면 올림수 1에 값은 0 / 더해서 3이 올림수 1에 값은 1

  • 처음에 제출했던 코드
var addBinary = function(a, b) {
  // return (parseInt(a, 2) + parseInt(b, 2)).toString(2);


  let highNum = 0;
  let lowNum = 0;

  if (a.length >= b.length) {
    highNum = a;
    lowNum = b;
  } else {
    highNum = b;
    lowNum = a;
  }



  let carry = 0;
  let resultBinary = [];
  let lowNumIndex = lowNum.length - 1;
  for (let i = highNum.length - 1; i > -1; i--) {

		let sum = 0;
    if (lowNumIndex > -1) {
      sum = Number(highNum[i]) + Number(lowNum[lowNumIndex]) + Number(carry);
      lowNumIndex--;
    } else {
      sum = Number(highNum[i]) + Number(carry);
    }

    switch (sum) {

      case 0:
        resultBinary.unshift(0);
        carry = 0;
        break;

      case 1:
        resultBinary.unshift(1);
        carry = 0;
        break;

      case 2:
        resultBinary.unshift(0);
        carry = 1;
        break;

      case 3:
        resultBinary.unshift(1);
        carry = 1;
        break;

    }

  }

  if (carry > 0) {
    resultBinary.unshift(carry);
  }

  return resultBinary.join('');


};
profile
developer life started : 2016.06.07 ~ 흔한 Front-end 개발자

0개의 댓글