统计能整除数字的位数

标签: 数学

难度: 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 <= 109
  • num 的数位中不含 0

Submission

运行时间: 24 ms

内存: 0.0 MB

class Solution:
    def countDigits(self, num: int) -> int:
        res = 0
        # print(list(str(num)))
        digs = list(str(num))
        for dig in digs:
            if num%int(dig)==0:res+=1
        return res
        
        

Explain

该解法首先将数字转化为字符串,以便于逐个访问每个数位的字符。然后,对于每个字符,将其转换回整数,并检查原始数字是否可以被这个数位整数整除。如果可以整除,则增加结果计数器。最后,返回结果计数器的值。

时间复杂度: O(d)

空间复杂度: O(d)

class Solution:
    def countDigits(self, num: int) -> int:
        res = 0  # 用于计数能整除num的数位数
        digs = list(str(num))  # 将数字num转换为字符串,并转换成字符列表
        for dig in digs:  # 遍历每个字符
            if num % int(dig) == 0:  # 将字符转换为整数,并检查能否整除num
                res += 1  # 如果可以整除,增加结果计数器
        return res  # 返回能整除的数位总数

Explore

在算法中,需要检查每个数位是否能整除原始数字`num`。如果数位中包含`0`,在执行整除操作时会导致除零错误,因为任何数字除以0都是不允许的,这会引发运行时错误。指定`num`的数位中不含`0`是为了避免这种错误,保证算法的顺利执行。

将数字`num`转换为字符串后使用`list(str(num))`是为了明确地将字符串转换成一个字符列表,这样可以直观地看到每个数位并进行遍历。实际上,直接遍历字符串也是可行的,因为字符串本身就是一个序列类型,可以直接进行索引访问和遍历。使用`list`转换主要是为了代码的可读性和清晰展示其意图。

在解法中,选择在循环内部使用`int(dig)`进行类型转换,是因为这样可以在需要使用数位进行运算的时候才进行转换,从而节约一定的资源,尤其是当数字`num`较大时。如果在循环开始前就将所有数位转换成整数,虽然可以减少循环中的转换次数,但会增加一次性的计算和存储开销。每种方式都有其优缺点,具体选择取决于具体情景和优化目标。

解题思路确实假设了每个数位的处理是独立的,并且假设所有字符都是合法的数字字符。如果输入包含非法字符(例如字母或特殊符号),则`int(dig)`转换会引发异常,影响到算法的执行。因此,在实际应用中,应当先验证输入的合法性,确保所有字符都是数字,以防止运行时错误。