leetcode
leetcode 2201 ~ 2250
统计能整除数字的位数

统计能整除数字的位数

难度:

标签:

题目描述

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 contain 0 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`。如果数位中包含`0`,在执行整除操作时会导致除零错误,因为任何数字除以0都是不允许的,这会引发运行时错误。指定`num`的数位中不含`0`是为了避免这种错误,保证算法的顺利执行。
🦆
在将数字`num`转换为字符串后,直接使用`list(str(num))`转换成字符列表有什么特别的考量吗?是否可以直接遍历字符串?
将数字`num`转换为字符串后使用`list(str(num))`是为了明确地将字符串转换成一个字符列表,这样可以直观地看到每个数位并进行遍历。实际上,直接遍历字符串也是可行的,因为字符串本身就是一个序列类型,可以直接进行索引访问和遍历。使用`list`转换主要是为了代码的可读性和清晰展示其意图。
🦆
在每次检查数位是否能整除`num`时,为什么选择使用`int(dig)`进行类型转换而不是在一开始就将所有数位转换成整数?
在解法中,选择在循环内部使用`int(dig)`进行类型转换,是因为这样可以在需要使用数位进行运算的时候才进行转换,从而节约一定的资源,尤其是当数字`num`较大时。如果在循环开始前就将所有数位转换成整数,虽然可以减少循环中的转换次数,但会增加一次性的计算和存储开销。每种方式都有其优缺点,具体选择取决于具体情景和优化目标。
🦆
解题思路似乎假设了每个数位字符的转换和整除检查都是独立的,是否存在一种情况下某个数位的特殊处理(例如非法字符)会影响到整体算法的执行?
解题思路确实假设了每个数位的处理是独立的,并且假设所有字符都是合法的数字字符。如果输入包含非法字符(例如字母或特殊符号),则`int(dig)`转换会引发异常,影响到算法的执行。因此,在实际应用中,应当先验证输入的合法性,确保所有字符都是数字,以防止运行时错误。

相关问题