LeetCode之旅-2

今天做了一道题目:Add Digits
题目内容:
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.

For example:

Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it.

Follow up:
Could you do it without any loop/recursion in O(1) runtime?

大致意思是:给定一个非负整型数字,重复相加其所有的数字直到最后的结果只有一位数。
看完题目觉得这道题很简单,不过看到后面的要求:不能使用任何循环和递归,而且在O(1)时间完成,这就觉得有点麻烦了。。。
不使用循环和递归能完成的话,说明给定的数字和结果一定存在某种规律,于是自己算了一下,
发现计算的之前的数和计算之后的数相差9的倍数。即 C0C1=9S
其中 Cn 为C第n次计算后的数,S由 C0 的各个位数决定。
比如 C0=1234

C0=1103+2102+3101+4100
C1=1+2+3+4
C0C1=1(1031)+2(1021)+3(1011)+4(1001) =1999+299+39
=9(1111+211+31)

不过后面就没有头绪了。。。
于是在网上查了一下,发现了“Digital root(数根)”,维基百科里面介绍的很详细。

数根:将一非负整数的各个位数相加,若加完后的值大于等于10的话,则继续将各位数进行相加直到其值小于10为止,则所得的值为该数的数根。

求树根的方法是Congruence formula(同余式),公式如下:

这里写图片描述

不过自己还是想证明一下
刚刚得出 C0=C1+9S ,将两边模9,即:
C0(mod9)=(C1+9S)(mod9)
显然 C0C1(mod9)
所以一个数和它的各数位之和模9同余。

C0C1C2...Cn(mod9)
CnCn1

而数根d,是在0-10之间,即 0d9
所以数根 d(mod9)=d
因此

C(mod9)=d

不过有一种特殊情况,当C是9的倍数时,数根为9。

知道了算法,接下来就是写代码了,代码很简单,就一句:

public class Solution {
    public int addDigits(int num) {
        return 1+(num-1)%9;
    }
}

提交后,运行时间为2ms,但是!重点来了!!!
居然有0.04%的solution是1ms!!!
至今没找到1ms的方法。。。
希望在以后的学习中能够找到这个方法。

收获如下:

  1. 数根
  2. 一个数是不是9的倍数,可以通过该数各位数字之和来判断。
  3. 在MarkDown编辑器中插入公式
  4. 收获了几个英语单词:
    congruence(同余)
    formula(公式)
    non-negative(非负)
    recursion(递归)
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值