258. 各位相加(简单题)

题目描述:
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

示例:

输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-digits

解法:

class Solution {
    public int addDigits(int num) {
        while (num > 9) {
            int a = num % 10;//让num不断除以10,并取得余数
            int b = num / 10;//就可以让该数字的非各位的数字变成个位
            num = a + b;	 //将余数和商相加后,再赋值给num,直到num小于10
        }
        return num;
    }
}

进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
进阶解法:

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

进阶思路分析,来源题解,用自己语言复述。
假设一个大于9的数,就拿题目给的例子38,计算过程就是3+8=11,1+1=2。计算过程我们可以理解为,38这个数,它的十位上的3,其实代表的是3个10,在计算过程中每一个10拿出一个1来和末位求和计算,每一个10剩一个9,。那可以拿出几个1呢? (30%9=3),也就是3个1。
那我们的计算其实就成了30%9+8%9=11,1%9+1%9=2。
它就等价为38%9=2。
但是需要注意的是,如果这个数是9的倍数,比如81,72,这些数直接对9取余是0,所以需要分别讨论,而且我们都知道,9的倍数的各个位数相加等于9
所以最终,我们写成 return num % 9 == 0 ? 9 : num % 9;当然n=0的情况要单独讨论

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值