加载中...
728-自除数(Self Dividing Numbers)
发表于:2021-12-03 | 分类: 简单
字数统计: 765 | 阅读时长: 3分钟 | 阅读量:

原文链接: 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 because 128 % 1 == 0, 128 % 2 == 0, and 128 % 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 == 0128 % 2 == 0128 % 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%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言

相似题目

题目 难度
完美数 简单
上一篇:
725-分隔链表(Split Linked List in Parts)
下一篇:
729-我的日程安排表 I(My Calendar I)
本文目录
本文目录