Leetcode258. Add Digits计算数字根

Leetcode258. Add Digits计算数字根_第1张图片

普通思路就是数字拆分字符串再转数字一一相加,并递归了。代码如下
function addDigits(num) { if (num < 10) { return num; } var result = 0; (num + '').split('').forEach(item => { result = parseInt(item, 10) + result }); return addDigits(result); }

提交查看结果:


Leetcode258. Add Digits计算数字根_第2张图片
普通结果.png

运行时间还属于中等偏长的,时间复杂度也是O(n);
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
尝试用eval,但是提示eval坏处大,不让用...

吾辈没有不同常人的大脑,所以只能各种情况枚举,猜想其中是否有什么不得了的规矩,可以让人一下子就能得到答案?

addDigits(23) //=>5
addDigits(2019) //=>3
addDigits(666) //=>9
addDigits(987654321) //=>9

我们发现,这些数返回值都是0-9的整数(废话),假设我认为他们一定又什么规(yin)律(mou),那么损失的数字(初始值与结果的差)是不是有什么规律?

addDigits(23) //=>5 =>18/9=2
addDigits(2019) //=>3 =>2016/9=224
addDigits(666) //=>9 =>657/9=73
addDigits(987654321) //=>9 =>懒得算了...

哇,也就是说 result = num%9???
987654321%9 //=>0???
由于num恰好是9的倍数的情况,所以要进行适当的处理,最终我们结果是
function addDigits(num) { if (num < 10) { return num; } else { return num % 9 || 9; } }
哈哈,应该不错了吧,看看结果。

Leetcode258. Add Digits计算数字根_第3张图片
Paste_Image.png

注:这里第一个if判断应该是<1,提交后beats 80.37%。 (原来判断数值大小会差别那么多?)

???前面还这么多人...leetcode不愧都是些厉害的大神...于是我点开discuss看看还有什么不得了的东西。
我们来看看view数排名第一的topic,看id估计还是国人...

Leetcode258. Add Digits计算数字根_第4张图片
Paste_Image.png

那么我们再思考这个公式(1 +(n-1)%9)怎么来呢...我们再思考,对于余数在1-8之间,直接返回即可,但是余数是0的,有两种可能0和9的倍数,那么如何区分这两种可能?但是除以9的余数除了1-8和0之外还有别的可能吗??
没错,就是负数。也就是说我们要至少引进一个负数的结果,那么就要用到减法了。
将 x +(num - x)% 9。x属于正整数。

那我随便来个简单的x,就取值为1吧,来提交试试。

function addDigits(num) { return 1 + (num - 1) % 9; }

Leetcode258. Add Digits计算数字根_第5张图片
Paste_Image.png

喵喵喵?写不下去了...装逼失败...

你可能感兴趣的:(Leetcode258. Add Digits计算数字根)