每天一道前端算法题day01-数组形式的整数加法

222 阅读2分钟

题目描述(LeetCode第989题)

对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。
例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。

给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。

示例 1:

输入:A = [1,2,0,0], K = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234
示例 2:

输入:A = [2,7,4], K = 181
输出:[4,5,5]
解释:274 + 181 = 455
示例 3:

输入:A = [2,1,5], K = 806
输出:[1,0,2,1]
解释:215 + 806 = 1021
示例 4:

输入:A = [9,9,9,9,9,9,9,9,9,9], K = 1
输出:[1,0,0,0,0,0,0,0,0,0,0]
解释:9999999999 + 1 = 10000000000
 

提示:

1 <= A.length <= 10000
0 <= A[i] <= 9
0 <= K <= 10000
如果 A.length > 1,那么 A[0] != 0

答案

方案一(不推荐):

//直接将数组转换成字符串后再相加求和,最后将结果再改为数组
//这种方法虽然简单便捷但是不推荐,这样做这道题目的就失去意义了
    /**
 * @param {number[]} num
 * @param {number} k
 * @return {number[]}
 */
var addToArrayForm = function (num, k) {
    return (BigInt(num.join('')) + BigInt(k)).toString().split('')
};

至于为什么要用BigInt,是因为js处理超过16位的数就会造成精度丢失

image.png

方案二

思路:

(1)将数组num和k对应位数相加,至于怎么对应? num先取下标num.length-1,后面下标递减 k将其k%10,判断每次相加若果结果大于9,则需要进位;我这里把进位加到了k上,这样操作就会更加方便.

(2)当数组最高位相加结果大于10,那么就在数组前面unshift(1)

(3)如果num元素个数 < k的数字个数,则进行互换

var addToArrayForm = function(num, k) {
  let sum = 0 //每次对应位相加的和
  let flag = false // 当最高位相加>=10且index ==== 0时设为true
  let arrK = k.toString().split('') //将k转换成数组
  // 判断num的位数和k的位数,如果num位数小于k的位数,两者互换
  if (num.length < arrK.length) {
      let tem = num
      var arr = []
      arrK.map(item => arr.push(parseInt(item)));
      num = arr
      k = parseInt(tem.join(''))
  }   
  let index = num.length - 1 //当前操作num的索引
  while (index >= 0 || k > 0) {
      sum = num[index] + (k % 10)
      if (sum >= 10) {
          k += 10 //这里把进位加到了k上,更加方便操作
          if(index === 0) flag = true
      }
      num[index] = sum % 10
      k = Math.floor(k / 10)
      index--
  }
  if (flag) num.unshift(1)
  return num
};

ps:如果有错误的地方欢迎指正,有好的方法也欢迎评论,刚入算法,感觉好难......