统计能整除数字的位数
难度:
标签:
题目描述
Given an integer num
, return the number of digits in num
that divide num
.
An integer val
divides nums
if nums % val == 0
.
Example 1:
Input: num = 7 Output: 1 Explanation: 7 divides itself, hence the answer is 1.
Example 2:
Input: num = 121 Output: 2 Explanation: 121 is divisible by 1, but not 2. Since 1 occurs twice as a digit, we return 2.
Example 3:
Input: num = 1248 Output: 4 Explanation: 1248 is divisible by all of its digits, hence the answer is 4.
Constraints:
1 <= num <= 109
num
does not contain0
as one of its digits.
代码结果
运行时间: 24 ms, 内存: 0.0 MB
// Java Stream solution
/*
* 思路:
* 1. 将数字 num 转换为字符串。
* 2. 使用 Stream API 逐位检查是否能整除 num。
* 3. 使用 filter 过滤出能整除的数字并统计数量。
*/
import java.util.stream.Stream;
public class Solution {
public int countDigits(int num) {
return (int) Stream.of(String.valueOf(num).split(""))
.mapToInt(Integer::parseInt)
.filter(digit -> digit != 0 && num % digit == 0)
.count();
}
}
解释
方法:
该解法首先将数字转化为字符串,以便于逐个访问每个数位的字符。然后,对于每个字符,将其转换回整数,并检查原始数字是否可以被这个数位整数整除。如果可以整除,则增加结果计数器。最后,返回结果计数器的值。
时间复杂度:
O(d)
空间复杂度:
O(d)
代码细节讲解
🦆
为什么在题目中指定`num`的数位中不含`0`?如果包含`0`会对算法有什么影响?
▷🦆
在将数字`num`转换为字符串后,直接使用`list(str(num))`转换成字符列表有什么特别的考量吗?是否可以直接遍历字符串?
▷🦆
在每次检查数位是否能整除`num`时,为什么选择使用`int(dig)`进行类型转换而不是在一开始就将所有数位转换成整数?
▷🦆
解题思路似乎假设了每个数位字符的转换和整除检查都是独立的,是否存在一种情况下某个数位的特殊处理(例如非法字符)会影响到整体算法的执行?
▷