Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述:
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
示例 1:
输入: num = 38
输出: 2
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于 2 是一位数,所以返回 2。
示例 2:
输入: num = 0
输出: 0
二、思路分析:
考察点
模拟 -> 数学(规律总结)
这道题的定位的难度是简单,阅读完题目之后发现我们可以直接模拟题目中的计算步骤来得出结果。但进阶版还能有更加快速的解法,想要实现O(1)时间复杂度的算法,我们需要去了解一下同余定理。
模拟
当各个位数相加得出的结果仍为2位数时,不断循环重新计算新数的各个位数相加之和,直到结果为1位数时即为我们需要的结果。
数学
不知道大家有没有听过这样一个定理:同余定理,同余定理是数论中的重要概念,给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系。 这道题正好可以利用同余定理来进行解题,我们要求每位数相加之和求模等价于每个数分别对 9 取模之和,也等价于原数字对9取模的结果,因为9对9取模的结果为1,但我们想要得到的应该是9,所以我们需要对相加结果为 99 的边界情况进行处理。
具体代码如下:
三、AC 代码:
1、模拟解法
/**
* @param {number} num
* @return {number}
*/
var addDigits = function(num) {
let res = num;
while(res >= 10){
num = res;
res = 0;
while(num > 0){
res += num % 10;
num = Math.floor(num / 10);
}
}
return res;
};
2、数学(规律总结)
/**
* @param {number} num
* @return {number}
*/
var addDigits = function(num) {
return (num - 1) % 9 + 1;
};
四、总结:
一个题目往往会存在多个不同的解法,而算法优化的主要方式便是利用数学公式来优化过程,所以说学好数理化,走遍天下都不怕,代码的尽头还是数学,我们有必要去提升一下自己的数学知识素养。