📖本篇内容: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今天小付打卡了哦~
美好的日出 美好的山河
都因有你存在 而璀璨 耀眼