js 大数求和/去除科学计数法/ 力扣两数相加

最近小组的一位同学在LeeCode上的一道题犯愁了,最后一起研讨了下,终于解决了,发现在力扣上出错率还挺高,给大家分享一下:


1,题目截图:

     

 

 

2,涉及知识点


        a: 链式结构 =》 ListNode格式 { val: 1, next: { val: 1, next: {val: 2, next: null }}}

        b: 大数求和, 不采用科学计数法,最后可用于数组或者字符串显示

        c:递归 =》 链式结构转数组, 数组转对应的链式结构
 

3, 解题方案(具体代码在图片正下方)       

 

4, 代码展示

/**

 * Definition for singly-linked list.

 * function ListNode(val, next) {

 *     this.val = (val===undefined ? 0 : val)

 *     this.next = (next===undefined ? null : next)

 * }

 */

/**

 * @param {ListNode} l1

 * @param {ListNode} l2

 * @return {ListNode}

 */

// ListNode格式 { val: 1, next: { val: 1, next: {val: 2, next: null }}}

// 获取ListNode中val形成新的数组

const getValArray = (obj, arr = []) => {

    arr.push(obj.val || 0)

    if (obj.next) {

        getValArray(obj.next, arr)

    }

    return arr

}

// 将数组转化为ListNode格式

const getResultObj = (arr = []) => {

    return {

        val: arr[0] || 0,

        next: arr.length > 1 ? getResultObj(arr.splice(1)) : null

    }

}

// 改变数组长度, 用0填充,便于不同长度两数相加

const padZero = (a1, a2) => {

    const maxLength = Math.max(a1.length, a2.length)

    let newArray

    const solve = (arr) => {

        return arr.join('').padStart(maxLength, 0).split('')

    }

    if (a1.length === maxLength) {

        newArray = [a1, solve(a2)]

    } else {

        newArray = [solve(a1), a2]

    }

    return newArray

}

// 大数相加

const bigNumberSum = (arr) => {

    const a1 = arr[0], a2 = arr[1], length = a1.length

    let result = [], flg = 0, sum = 0

    for(let i = length - 1; i >= 0; i--) {

        const num1 = Number(a1[i]) || 0

        const num2 = Number(a2[i]) || 0

        sum = num1 + num2 + flg

        if (sum >= 10) {

            sum = sum % 10

            flg = 1

        } else {

            flg = 0

        }

        result.unshift(sum)

        if (i === 0 && flg) {

            result.unshift(1)

        }

    }

    return result.reverse()

}

// 结果值

const addTwoNumbers = (l1, l2) => {

    const arr1 = getValArray(l1).reverse()

    const arr2 = getValArray(l2).reverse()

    return getResultObj(bigNumberSum(padZero(arr1, arr2)))

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值