zoukankan      html  css  js  c++  java
  • 258. 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 = 111 + 1 = 2. Since 2 has only one digit, return it.

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

    Hint:

      1. A naive implementation of the above process is trivial. Could you come up with other methods?
      2. What are all the possible results?
      3. How do they occur, periodically or randomly?
      4. You may find this Wikipedia article useful.

    链接: http://leetcode.com/problems/add-digits/

    题解:

    又是数学题,求digital root。循环叠加比较容易,但看了wiki以后发现了公式,还是用公式算吧。这种数学题对数学不好的我来说真是头大。原理10 % 9 或者 100 % 9都等于 1 % 9。举个例子n = abc = a  * 100 + b * 10 + c,那么 (a*100 + b * 10 + c) % 9 = (a + b + c) % 9。由此n == 0时,result = 0, n % 9 == 0时, 说明a + b + c = 9,我们返回9,对于其他数字, (a + b + c)等于res % 9。  

    Time Complexity - O(1), Space Complexity - O(1)

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

    二刷:

    Java:

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

    三刷:

    发现前两刷其实并没有完全理解,也许就是看了discuss区的答案而已。为什么(a + b + c) mod 9 = (abc) mod 9, 真正用到的公式是modulo运算的分配和结合律。

    1.  (a + b) mod n  = ((a mod n) + (b mod n)) mod n

    2.  (a * b) mod n = ((a mod n) * (b mod n)) mod n

    假如一个数字的三位字符是abc,那么这个数等于 a * 100 + b * 10 + c, 根据分配律,  (a * 100) mod 9 = ((a mod 9) * (100 mod 9)) mod 9 = a mod 9,b和c同理, 所以 (a * 100 + b * 10 + c) mod 9 = (a + b + c) mod 9。  我们还可以使用一个小技巧,再用一次分配律直接用 (num - 1) mod 9 + 1来得到结果,这样可以避免一些边界条件的判断。

    public class Solution {
        public int addDigits(int num) {
            if (num == 0) {
                return 0;
            }
            int res = num % 9;
            return res == 0 ? 9 : res;
        }
    }
    public class Solution {
        public int addDigits(int num) {
            return 1 + (num - 1) % 9;
        }
    }

    Update:

    public class Solution {
        public int addDigits(int num) {
            if (num <= 0) return 0;
            return (num % 9 == 0) ? 9 : num % 9;
        }
    }

    Reference:

    https://en.wikipedia.org/wiki/Digital_root

    https://en.wikipedia.org/wiki/Modulo_operation

    https://leetcode.com/discuss/67755/3-methods-for-python-with-explains

    https://leetcode.com/discuss/52122/accepted-time-space-line-solution-with-detail-explanations

    https://leetcode.com/discuss/55910/two-lines-c-code-with-explanation

  • 相关阅读:
    python函数函数嵌套分析步骤与递归函数
    解决Navicat运行sql文件报错:1292
    SOAP与REST,有什么不同?
    bcrypt vs crypto vs cryptojs
    bcryptjs加密如何工作
    AOP(面向切面编程)
    javascript语言搞笑图
    js中函数声明先提升还是变量先提升
    CSS的单位及css3的calc()及line-height百分比
    Vue 项目性能优化 — 实践指南(网上最全 / 详细)
  • 原文地址:https://www.cnblogs.com/yrbbest/p/5014963.html
Copyright © 2011-2022 走看看