题目形容

给定一个由 整数 组成的 非空 数组所示意的非负整数,在该数的根底上加一。

最高位数字寄存在数组的首位, 数组中每个元素只存储单个数字。

你能够假如除了整数 0 之外,这个整数不会以零结尾。

示例 1:

输出:digits = [1,2,3]输入:[1,2,4]解释:输出数组示意数字 123。

示例 2:

输出:digits = [4,3,2,1]输入:[4,3,2,2]解释:输出数组示意数字 4321。

示例 3:

输出:digits = [0]输入:[1]
力扣原题目地址:https://leetcode.cn/problems/...

应用Bigint解决大数精度失落问题

当本宗看到此题时,登时黑人问号涌上心头,什么?这么简略的力扣题目,不会吧!不会吧!(白岩松式纳闷)这不就是:

  1. 把数组转化成字符串再转成数字,而后加一(因为数字能力加一)
  2. 而后再把数字转回去,转成数组

于是乎,本宗祭出飞天指法,敲击在本宗秘宝、远古仙器机械茶轴键盘上,霎时间,诡异的声音直冲云霄,恐怖的威压席卷大地。周遭一些实力不济的程序猿兽,一口鲜血从七窍喷涌而出,身材倒飞而出,在地上犁出一条长几十米深半米多的沟壑,最终狠狠地撞击在公司杂物间的墙壁上,带起漫天烟尘。烟尘散去,条条稀稀拉拉蛛网般的裂缝爬满墙壁。三秒后,苦苦撑持的皲裂墙壁终于轰然倒塌,将哪些气若游丝的程序员兽埋在废墟下方,不知死活。

本宗不禁大喜,飞天指法,恐怖如斯、仙器键盘,强悍至此!

本宗心神一动,顷刻间,玄而又玄的代码便是凭空出现:

var plusOne = function (digits) {     digits = digits.join('') * 1 // 数组转字符串再转数字    digits = digits + 1 // 数字加一    return (digits + '').split('') // 再把数字转成字符串并宰割成数组即可};

本宗得意的望着本人发明出的玄妙代码,捋了捋胡须,从容不破的点了提交,本认为会胜利通过,然而接下来的画面,让本宗倒吸一口凉气:

没通过测试用例!

本宗眉头一皱,发现这道题并没有这么简略,因为本宗忽然想起来远古斗码大陆流传的一部《玄天js古经书》,书中有这样一段艰涩难懂的真奥之理:

js中数字类型无奈示意大数,即超过16位数字,会呈现精度失落问题

果然如此!

报错的用例是达到了恐怖的19位数,远超16位啊,所以呈现精度失落,所以答案不正确。

看来出题人应该就是传说中的bug强人!本宗纵横此斗码大陆多年,没想到明天竟然阴沟里翻车,若传出去本宗颜面何在?岂不叫小辈贻笑大方?

不行,本宗心一横,心中盘算道:此问题不能留!

突然,虚空中一道苍老的声音传出:吾乃代码老怪,感觉与你颇有机缘,今日赠你一部js修炼大法《M帝恩》!

多写前辈大恩,本宗就勉为其难收下了。

不知何时,本宗的电脑屏幕上多了一个链接:https://developer.mozilla.org...

先不论这么多了,此人到没有歹意...

于是在js修炼大法《M帝恩》的帮忙下,本宗解决了这道题

var plusOne = function (digits) {     let number = BigInt(digits.join('')); // 应用BigInt避免精度失落    number = number + BigInt(1) // BigInt与BigInt同类型相加    let res = (number + '').split('') // 再转回数组即可    return res };

相比拟上方的错误做法,其就是应用了Bigint对象,去解决超过16位的大数问题。所以大家在遇到大数问题的时候,就能够思考应用bigint对象去管制,这样的话,就不会精度失落哦。敞开bigint的知识点,在这里就不赘述了,大家能够在上方的MDN连贯上看一下

力扣刷题其实挺无聊的,所以写一篇“代码修仙文”,供大家一乐^_^