题目形容
给定一个由 整数
组成的 非空
数组所示意的非负整数,在该数的根底上加一。
最高位数字寄存在数组的首位, 数组中每个元素只存储单个数字。
你能够假如除了整数 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解决大数精度失落问题
当本宗看到此题时,登时黑人问号涌上心头,什么?这么简略的力扣题目,不会吧!不会吧!(白岩松式纳闷)这不就是:
- 把数组转化成字符串再转成数字,而后加一(因为数字能力加一)
- 而后再把数字转回去,转成数组
于是乎,本宗祭出飞天指法,敲击在本宗秘宝、远古仙器机械茶轴键盘上,霎时间,诡异的声音直冲云霄,恐怖的威压席卷大地。周遭一些实力不济的程序猿兽,一口鲜血从七窍喷涌而出,身材倒飞而出,在地上犁出一条长几十米深半米多的沟壑,最终狠狠地撞击在公司杂物间的墙壁上,带起漫天烟尘。烟尘散去,条条稀稀拉拉蛛网般的裂缝爬满墙壁。三秒后,苦苦撑持的皲裂墙壁终于轰然倒塌,将哪些气若游丝的程序员兽埋在废墟下方,不知死活。
本宗不禁大喜,飞天指法,恐怖如斯、仙器键盘,强悍至此!
本宗心神一动,顷刻间,玄而又玄的代码便是凭空出现:
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连贯上看一下力扣刷题其实挺无聊的,所以写一篇“代码修仙文”,供大家一乐
^_^