原文链接: https://leetcode-cn.com/problems/self-dividing-numbers
英文原文
A self-dividing number is a number that is divisible by every digit it contains.
- For example,
128
is a self-dividing number because128 % 1 == 0
,128 % 2 == 0
, and128 % 8 == 0
.
A self-dividing number is not allowed to contain the digit zero.
Given two integers left
and right
, return a list of all the self-dividing numbers in the range [left, right]
.
Example 1:
Input: left = 1, right = 22 Output: [1,2,3,4,5,6,7,8,9,11,12,15,22]
Example 2:
Input: left = 47, right = 85 Output: [48,55,66,77]
Constraints:
1 <= left <= right <= 104
中文题目
自除数 是指可以被它包含的每一位数除尽的数。
例如,128 是一个自除数,因为 128 % 1 == 0
,128 % 2 == 0
,128 % 8 == 0
。
还有,自除数不允许包含 0 。
给定上边界和下边界数字,输出一个列表,列表的元素是边界(含边界)内所有的自除数。
示例 1:
输入: 上边界left = 1, 下边界right = 22 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
注意:
- 每个输入参数的边界满足
1 <= left <= right <= 10000
。
通过代码
官方题解
方法一:暴力法
算法:
- 对于给定范围内的每个数,我们将直接判断该数是否为自除数。
- 根据定义,我们先判断数字是否非零,若数字非零再判断是否能够被该数除尽。例如,对于
128
,我们要判断d != 0 && 128 % d == 0
,且d = 1, 2, 8
。 - 解决这个问题的一个简单方法是将数字转换成一个字符数组(python 中的字符串),然后在检查
n%d==0
时转换回整数执行模运算。 - 我们还可以不断地把数字除以
10
,取整数的最后一个数字。在代码中为注释的部分。
class Solution(object):
def selfDividingNumbers(self, left, right):
def self_dividing(n):
for d in str(n):
if d == '0' or n % int(d) > 0:
return False
return True
"""
Alternate implementation of self_dividing:
def self_dividing(n):
x = n
while x > 0:
x, d = divmod(x, 10)
if d == 0 or n % d > 0:
return False
return True
"""
ans = []
for n in range(left, right + 1):
if self_dividing(n):
ans.append(n)
return ans #Equals filter(self_dividing, range(left, right+1))
class Solution {
public List<Integer> selfDividingNumbers(int left, int right) {
List<Integer> ans = new ArrayList();
for (int n = left; n <= right; ++n) {
if (selfDividing(n)) ans.add(n);
}
return ans;
}
public boolean selfDividing(int n) {
for (char c: String.valueOf(n).toCharArray()) {
if (c == '0' || (n % (c - '0') > 0))
return false;
}
return true;
}
/*
Alternate implementation of selfDividing:
public boolean selfDividing(int n) {
int x = n;
while (x > 0) {
int d = x % 10;
x /= 10;
if (d == 0 || (n % d) > 0) return false;
}
return true;
*/
}
复杂度分析
- 时间复杂度:$O(D)$。$D$ 是在区间 $[L, R]$ 里的整数数。
- 空间复杂度:$O(D)$,使用了一个数组来存放结果。
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
35062 | 46141 | 76.0% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|
相似题目
题目 | 难度 |
---|---|
完美数 | 简单 |