题目

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.

Example:

  1. Input: 38
  2. Output: 2
  3. Explanation: The process is like: 3 + 8 = 11, 1 + 1 = 2.
  4. Since 2 has only one digit, return it.

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


题意

将一个整数的各位数相加得到新整数,重复该步骤直到最终得到的是一个一位数。

思路

常规方法就是不断拆分相加直到得到最终结果。

O(1)方法:具体解析见LeetCode: Add Digits - 非负整数各位相加


代码实现

Java

迭代

  1. class Solution {
  2. public int addDigits(int num) {
  3. while (num > 9) {
  4. num = solve(num);
  5. }
  6. return num;
  7. }
  8. private int solve(int num) {
  9. int res = 0;
  10. while (num != 0) {
  11. res += num % 10;
  12. num /= 10;
  13. }
  14. return res;
  15. }
  16. }

公式计算

  1. class Solution {
  2. public int addDigits(int num) {
  3. return (num - 1) % 9 + 1;
  4. }
  5. }

JavaScript

迭代

  1. /**
  2. * @param {number} num
  3. * @return {number}
  4. */
  5. var addDigits = function (num) {
  6. while (num > 9) {
  7. let tmp = 0
  8. while (num) {
  9. tmp += num % 10
  10. num = Math.trunc(num / 10)
  11. }
  12. num = tmp
  13. }
  14. return num
  15. }

公式计算

  1. /**
  2. * @param {number} num
  3. * @return {number}
  4. */
  5. var addDigits = function (num) {
  6. return (num - 1) % 9 + 1
  7. }