Easy
题目描述
给你一个整数 num ,返回 num 中能够整除 num 的数字的数目。
如果 nums % val == 0 ,则认为整数 val 可以整除 nums 。
示例 1:
输入:num = 7
输出:1
解释:7 被自己整除,因此答案是 1 。
示例 2:
输入:num = 121
输出:2
解释:121 可以被 1 整除,但不能被 2 整除。由于 1 在数字中出现两次,我们返回 2 。
示例 3:
输入:num = 1248
输出:4
解释:1248 能被它的每一位数字整除,因此答案是 4 。
提示:
1 <= num <= 10^9num不含0作为其中一位数字。
解题思路
这道题的核心思路是遍历数字的每一位,检查该位数字是否能整除原数字。
解法分析:
数字拆分法(推荐):通过不断对10取余和整除来获取每一位数字
- 使用
num % 10获取最低位数字 - 使用
num / 10去除最低位,继续处理剩余部分 - 对每一位数字检查是否能整除原数字
- 使用
字符串转换法:将数字转为字符串,遍历每个字符
- 实现简单但涉及类型转换,性能稍逊
算法步骤:
- 保存原始数字用于整除判断
- 初始化计数器为0
- 当数字大于0时循环:
- 取出最低位数字
- 检查该数字是否能整除原数字
- 如果能整除,计数器加1
- 去除最低位,继续处理
- 返回计数结果
由于题目保证数字中不含0,所以不需要处理除0的情况。
代码实现
class Solution {
public:
int countDigits(int num) {
int originalNum = num;
int count = 0;
while (num > 0) {
int digit = num % 10;
if (originalNum % digit == 0) {
count++;
}
num /= 10;
}
return count;
}
};
class Solution:
def countDigits(self, num: int) -> int:
original_num = num
count = 0
while num > 0:
digit = num % 10
if original_num % digit == 0:
count += 1
num //= 10
return count
public class Solution {
public int CountDigits(int num) {
int originalNum = num;
int count = 0;
while (num > 0) {
int digit = num % 10;
if (originalNum % digit == 0) {
count++;
}
num /= 10;
}
return count;
}
}
/**
* @param {number} num
* @return {number}
*/
var countDigits = function(num) {
let count = 0;
let temp = num;
while (temp > 0) {
let digit = temp % 10;
if (num % digit === 0) {
count++;
}
temp = Math.floor(temp / 10);
}
return count;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(log n) | 需要遍历数字的每一位,位数为 log₁₀(n) |
| 空间复杂度 | O(1) | 只使用常数额外空间 |
相关题目
. Happy Number (Easy)
. Self Dividing Numbers (Easy)