需求描述:请封装一个add()
方法,用于计算两个a->b
格式的字符串的和(其中a
和b
都是[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
本篇结束!!!
网友评论