leetcode每日一题258. 各位相加 一题三做 递归 / 暴力 / 数学 通俗易懂

本文介绍了如何通过三种方法解决LeetCode上的258题,包括暴力模拟、递归求解和利用数学性质。作者展示了每种方法的代码实现,并分析了它们的时间和空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

📖本篇内容:Leetcode每日一题258. 各位相加 一题三做 递归 / 暴力 / 数学

📑 文章专栏:leetcode每日一题《打卡日常》

📆 最近更新:2022年3月2日 leetcode每日一题 564. 寻找最近的回文数 困难的字符串拼接\特殊示例输入扩展思维

⭐算法仓库:小付的算法之路——Alascanfu-algorithm.git.io

🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 关爱程序猿,从你我做起

🙊写在前面🙊

来了来了,上午满课,吃了午饭就来刷题了,今天是一道简单题,对于简单题来说,最好能想到多种解题方式,针对相同的题,构建不同的算法,针对时间与空间复杂度做出取舍很大程度上考察的是程序猿们对时间/空间复杂度的敏感点。最近在看《剑指Offer》所以对于作者提出的这些点现在小付也要做出注意越简单的题考察的点可能就更加对于程序猿能力的认知,话不多说咱们走着,一题三做

题目

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。

示例1:

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

示例2:

输入: num = 0
输出: 0

提示

  • 0 <= num <= 231 - 1

📝思路📝

本题考查知识点

  • 思路1——暴力模拟AC:比较容易想到的暴力模拟AC解决因为一开始我们的固化思维,都会想着如何快速且不计时间的想法去解决这道题。直接暴力模拟先计算出各位之和,然后对于各位之和做出判定 只有当各位之和为一位数时才是返回的结果,而我们可以将各位之和如题所说,每次逐位相加到当前数字缩短一位的数字,直至结果为1位数字时就是结果。
  • 思路2——递归求解:有了上面思路的解题方法之后,我们很容易就会想到 如果当前num为一位数时就直接返回结果,反之 num 则逐位相加的思想num 为一位数时就是递归的跳出条件递归求解逐位相加即可
  • 思路3——数学求解:我们很容易就知道最后的返回结果为1 ~ 9这9个数字无论给出的num数值为多少最后都会返回1 ~ 9的数字,那就容易了,这些数字的结果都是在这九个结果集中的,所以我们假定该数进行对9取余就可以获得该数在9个结果集中的位置,也就是对于到达最后一位数字的结果,但是我们需要考虑额外的情况,当刚好可以被9整除时我们返回的就是9 拿19 ,90做特例即可

⭐代码实现⭐

暴力模拟AC

class Solution {
    public int addDigits(int num) {
    	// 滚动变量用于记录第一次num各位相加结果
        int res = 0;
        
        while (num > 0){
            res += num % 10;
            num /= 10;
        }
        
        // 我们对于滚动结果变量如果不是一位数字则需要对其逐位相加到缩短一位的数字进行处理 , 直到剩下移位数值结果
        while (res >= 10){
            res = res%10 + res/10;
        }
        // 返回结果
        return res;
    }
}
  • 时间复杂度:O(log num)
  • 空间复杂度:O(1)

递归求解

class Solution258 {
    /**
     * 递归实现 就两行
     */
    public int addDigits(int num) {
        // 递归结束终止条件 当num 为各位时直接返回
        if (num < 10) return num;
        // 每次只需要递归求解 逐位相加的结果 等同于我们上面计算res
        else return addDigits1(num % 10 + num / 10);
    }
}
  • 时间复杂度:O(log num)
  • 空间复杂度:O(1)

数学求解

class Solution {
    public int addDigits(int num) {
        if (num > 9){
            if (num % 9 == 0)return 9;
            return num % 9;
        }
        return num;
    }
}
  • 时间复杂度:O(1)
  • 空间复杂度:O(1)

运行结果

暴力模拟AC
在这里插入图片描述

递归求解
在这里插入图片描述

数学求解
在这里插入图片描述

本地测试

/***
 * @author: Alascanfu
 * @date : Created in 2022/3/3 12:28
 * @description: LeetCode 每日一题. 258各位相加 2022/03/03 测试类
 * @modified By: Alascanfu
 **/
public class Test258 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数字:");
        int num = sc.nextInt();
        System.out.println("它的各位之和一位数为:");
        System.out.println(new Solution258().addDigits(num));
    }
}

在这里插入图片描述

🙊写在最后🙊

2022-3-3今天小付打卡了哦~

美好的日出 美好的山河

都因有你存在 而璀璨 耀眼

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alascanfu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值