算法:求二进制的和

最近面试滴滴的前端,面试官问了一道算法题,是求两个二进制的和,让我 5 分钟之内写出来,当时心机,想到的思路是将两个二进制转化为 10 进制,相加之后得到的值再转换为二进制

function changeTen (...params) {
  let total = 0
  for (let i of params) {
    total += parseInt(i, 2)
  }
  console.log(total.toString(2))
}
changeTen('11', '10', '10', '1')

虽然答出来了,但是面试官不是很满意,人家是想让我写个逢二进一的那种算法,这 5分钟哪够啊~哭
于是今天没事写一写练一下

function changeTen (a, b) {
  // 得到的字符串
  let str = ''
  // 进位标志
  let carry = 0
  for (let i = 0; i < a.length; i++) {
    const currentA = parseInt(a[a.length - (i + 1)]) ? parseInt(a[a.length - (i + 1)]) : 0
    const currentB = parseInt(b[b.length - (i + 1)]) ? parseInt(b[b.length - (i + 1)]) : 0
    const sum = currentA + currentB + carry
    if (sum === 0) {
      str = '0' + str
      carry = 0
    } else if (sum === 1) {
      str = '1' + str
      carry = 0
    } else if (sum === 2) {
      str = '0' + str
      carry = 1
    } else if (sum === 3) {
      str = '1' + str
      carry = 1
    }
  }
  // 数字最头的进位
  if (carry === 1) {
    str = '1' + str
    carry = 0
  }
  // 最后去掉最头的0
  str = str.replace(/\b(0+)/gi, "")
  console.log(str)
}
changeTen('001110101', '0101110')

这就完成啦,也不是很难,当然还是可以再优化一下的~

你可能感兴趣的:(算法)