各位相加

题目描述:

  • 给定一个非负整数num,反复将各个位上的数字相加,直到结果是一位数为止,返回
  • 示例
  • 输入:38
  • 输出:2
  • 解释:各位相加的过程是:3 + 8 = 11, 1 +1 =2。由于2是一位数,所以返回2
  • 要求
  • 不使用循环或者递归,并且在O(1)时间复杂度内解决这个问题
  • 解析
  • 假设有一个三位数(其实几位数都行)
  • n1 = 100 * a + 10 * b + c ====> 变化之后 n2 = a + b + c =====> n1 - n2 = 99a + 9b 由此可以得到二者每次的变化就是将其缩小9的倍数
  • 相当于是n1只要各个位上的数字相加,就是缩小9的倍数,直到最后得到的是一个个位数,这样我们如果不用循环,不停的除以9,那么我们就可以使用取余操作,取到最后的结果
  • 代码示例
package com.xiyou.solutio;

/**
 * 给定一个非负整数num, 反复将各个位上的数字相加,直到结果为一位数
 * 示例:
 * 输入:38 输出:2
 * 解释:各位相加的过程为:3+8 = 11, 1+1=2
 * 要求:不使用循环或者递归将其解决,且在O(1)时间复杂度内解决这个问题
 * 思路:
 * - 假设有一个三位(任意位数都行)
 * n1 = 100 * a + 10 * b + c ====> 变化之后 n2 = a + b + c =====> n1 - n2 = 99a + 9b 由此可以得到二者每次的变化就是将其缩小9的倍数
 * 那么我们不停的对原来的数n1对9取余,就可以得到最后的余数就应该是相加的结果
 * 相当于是n1不停的缩小(9的倍数,所以不停的处以9,最后直到结果是一个个位数为止,就可以转换成对9取余)
 */
public class Solution {

    public static void main(String[] args) {
        int result = addDigits(123);
        System.out.println(result);
    }

    /**
     * 计算传进来的num的最终的个位数
     * @param num
     * @return
     */
    public static int addDigits(int num) {
        // 默认返回9 因为9 % 9 = 0
        int result = 9;
        // 如果当前传进来的参数 % 9 不为0,则直接返回取余的值
        if (num % 9 != 0) {
            result = num % 9;
        }
        // 如果当前的参数是0 0 % 0 也是 0 比较特殊 也应该特殊处理
        if (num == 0) {
            result = 0;
        }
        return result;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值