算法实现两数相加

2019-12-11  本文已影响0人  夏海峰

需求描述:请封装一个add()方法,用于计算两个a->b格式的字符串的和(其中ab都是[0, 9]之间的整数)。

示例演示:比如add('2->4->3', '5->6->4')时返回7->0->8,这个计算的依据是342+465=807

下面我将使用两种方案来封装这个add方法,实现代码参考如下:

# 方案一
var add1 = function($1, $2) {
  // 把‘2->4->3’格式,转化成 342整数
  let num1 = parseInt($1.split('->').reverse().join(''))
  let num2 = parseInt($2.split('->').reverse().join(''))
  // 相加后,把转换成 "a->b->...."格式
  return (num1 + num2).toString().split('').reverse().join('->')
}
# 方案二
var add2 = function($1, $2) {
  // 把‘2->4->3’格式,转换成 '243'字符串
  let num1 = $1.split('->').join('')
  let num2 = $2.split('->').join('')
  // 把 '243'字符串,转换成固定长度的字符串
  let length = Math.max(num1.length, num2.length)
  num1 = num1.padEnd(length, '0')
  num2 = num2.padEnd(length, '0')
  
  // 创建一个长度为 length+1 的数组,并填充 0
  let arr = new Array(length+1)
  arr.fill(0)
  // “和”运算
  arr.map((ele, idx, array)=>{
    array[idx] = parseInt(num1[idx]) + parseInt(num2[idx])
  })
  // 如果某个数组元素满10,就向下一个数组元素上加 1
  arr.map((ele, idx, array)=>{
    if (array[idx] >= 10) {
      array[idx] = ele - 10
      array[idx+1] = arr[idx+1]+1
    }
  })
  // 如果数组的最后一个元素为 0, 就删除这个元素
  if(!arr[length]) arr.splice(length, 1)
  // 返回最终相加后的结果,格式是 'a->b->c->...'
  return arr.join('->')
}

综合对比这两种实现方法,方案一更加快捷,完全符合数学中加法运算规律,代码量较小。方案二,实现思路更贴合常规思维,两数相加满10后向高位进一,但代码量较大,还用到了两次map循环,这个实现思路可以借鉴。

测试一下上述两个方法:

let $1 = '5->3->3->7->9->0->7'
let $2 = '5->6->4'
console.log(add1($1, $2))
console.log(add2($1, $2))

// 打印结果:0->0->8->7->9->0->7

本篇结束!!!

上一篇 下一篇

猜你喜欢

热点阅读