zoukankan      html  css  js  c++  java
  • LeetCode——Add Digits

    Description:

    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?

    题意很简单,最容易想到的办法就是循环迭代,如果是<10的就返回。下面是一种递归的方法。

    public class Solution {
        public int addDigits(int num) {
            if(num < 10) {
                return num;
            }
            //1023
            int t = 0;
            while(num >= 1) {
                t += num % 10;
                num = num / 10;
            }
            
            return addDigits(t);
        }
    }
    

      那么怎么做才能不用递归和循环迭代来把复杂度降到O(1)呢,这让我联想到了公式。来通过数据找找规律。

    前30个数据测试:

    public static void main(String[] args) {
    		for(int i=0; i<30; i++) {
    			System.out.println(i + " " + addDigits(i));
    		}
    	}
    

      

    0 0
    1 1
    2 2
    3 3
    4 4
    5 5
    6 6
    7 7
    8 8
    9 9
    10 1
    11 2
    12 3
    13 4
    14 5
    15 6
    16 7
    17 8
    18 9
    19 1
    20 2
    21 3
    22 4
    23 5
    24 6
    25 7
    26 8
    27 9
    28 1
    29 2

    找出来规律了吧。

    其实是这样的:(num-1) % 9 + 1

    public class Solution {
        public int addDigits(int num) {
           return (num-1) % 9 + 1;
        }
    }
    
  • 相关阅读:
    nyoj 16 矩形嵌套
    nyoj 44 子串和
    nyoj 448 寻找最大数
    nyoj 14 会场安排问题
    hdoj 1008 Elevator
    bzoj1588
    bzoj3224
    bzoj1503
    bzoj1834
    bzoj1066
  • 原文地址:https://www.cnblogs.com/wxisme/p/4746359.html
Copyright © 2011-2022 走看看