各位相加,直到得到一个一位的整数

小样儿,是不是以为题目哩我写错别字了?

1. 题目

给出一个非负整数 num,反复的将所有位上的数字相加,直到得到一个一位的整数

1.1 举个栗子

输入:
num=38
输出:
2
解释:
过程如下:3 + 8 = 11, 1 + 1 = 2. 因为 2 只有一个数字,返回 2
输入:
num=9
输出:
9
解释:
9<10,返回 9.

1.2 挑战

你可以不用任何的循环或者递归算法,在 O(1) 的时间内解决这个问题么?

2. 解法1

思路就是题目的要求

两层循环

外层循环判断num的结果是不是小于10了

内层循环对当前数字的各个位进行相加


public class Solution {
    /**
     * @param num: a non-negative integer
     * @return: one digit
     */
   public int addDigits(int num) {
       while(num >=10){
            int result = 0;
            while(num!=0){
                result += num%10;
                num=num/10;
            }
            num = result;
        }
        return num;
    }
}

3. 解法2

题目既然敢问能否在 O(1) 的时间内解决这个问题

那就说明肯定可以

image

不用循环,那必然是有规律的

那我们就来找找规律

拿出我的纸笔

image

果然,规律就是

从1开始,结果依次是1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9····

那就是在给定值>=1的时候,进行取余,余数就是结果

规律找到了,代码就简单了,一行就能搞定


public class Solution {
     /**
     * @param num: a non-negative integer
     * @return: one digit
     */
     public int addDigits(int num) {
        return num==0?num: (num%9==0?9:num%9);
    }
}

4. 解法3


public class Solution {
     /**
     * @param num: a non-negative integer
     * @return: one digit
     */
    public int addDigits(int num) {
         while(num>=10){
            num = num/10+num%10; 
        }
         return num;
    }
}

这个解法嘛

image

我也不知道为什么

反正对了

具体为什么对,还需要大神来证明一下了

文/戴先生@2020年6月28日

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值