zoukankan      html  css  js  c++  java
  • [LeetCode258] 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.

    中文(

    有一个非负整数num,重复这样的操作:对该数字的各位数字求和,对这个和的各位数字再求和……直到最后得到一个仅1位的数字(即小于10的数字)。

    例如:num=38,3+8=11,1+1=2。因为2小于10,因此返回2。

    解题方法:

    1.最好想到的方法不断对整数个位数相加直到小于10为止

    public class Solution {
        public int AddDigits(int num) {
            int next = GetNext(num);
            while(next>=10)
            {
                next = GetNext(next);
            }
            return next;
            
        }
        public int GetNext(int num)
        {
                string s = num.ToString();
                int sum = 0;
                for(int i = 0;i < s.Length;i++)
                {
                    sum += s[i]-'0';
                }
                return sum;
        }
    }

    2.O(1)的算法

    另一个方法比较简单,可以举例说明一下。假设输入的数字是一个5位数字num,则num的各位分别为a、b、c、d、e。

    有如下关系:num = a * 10000 + b * 1000 + c * 100 + d * 10 + e

    即:num = (a + b + c + d + e) + (a * 9999 + b * 999 + c * 99 + d * 9)

    因为 a * 9999 + b * 999 + c * 99 + d * 9 一定可以被9整除,因此num模除9的结果与 a + b + c + d + e 模除9的结果是一样的。

    对数字 a + b + c + d + e 反复执行同类操作,最后的结果就是一个 1-9 的数字加上一串数字,最左边的数字是 1-9 之间的,右侧的数字永远都是可以被9整除的。

    这道题最后的目标,就是不断将各位相加,相加到最后,当结果小于10时返回。因为最后结果在1-9之间,得到9之后将不会再对各位进行相加,因此不会出现结果为0的情况。因为 (x + y) % z = (x % z + y % z) % z,又因为 x % z % z = x % z,因此结果为 (num - 1) % 9 + 1,只模除9一次,并将模除后的结果加一返回。

    public class Solution {
         
        /**
         * 给定整数不断将它的各位相加,直到相加的结果小于10,返回结果
         * @param num
         * @return
         */
        public int addDigits(int num) {
            return (num - 1) % 9 + 1;
        }
    }
  • 相关阅读:
    二叉树的建树,按层遍历,结点总数,页结点,深度以及三序非递归遍历二叉树,建立中序线索二叉树
    志愿者选拔(单调队列)
    重建二叉树(中后序求前序)
    New Year Table(几何)
    Hopscotch(细节)
    红黑树(中序二叉树)
    Linux-awk命令详解
    Python--常用模块
    Python--re模块
    Python--模块与包
  • 原文地址:https://www.cnblogs.com/zhangbaochong/p/5054492.html
Copyright © 2011-2022 走看看