点击蓝字“dotNET匠人”关注我哟
加个“星标★”,每日 7:15,好文必达!
![]()
前言
前文传送门:
上篇文章中我们分析了一个递归描述的字符串问题,今天我们来分析一个数学问题,一道除法相关的面试题。

今天要给大家分析的面试题是 LeetCode 上第 728 号问题,
LeetCode - 728. 自除数
https://leetcode-cn.com/problems/self-dividing-numbers/
题目描述
自除数 是指可以被它包含的每一位数除尽的数。
例如,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。
贡献者: LeetCode
题目难度: Easy
通过率:
70.20%
相关话题
数学
https://leetcode.com/tag/math
相似题目
完美数
https://leetcode-cn.com/problems/perfect-number/ 难度: 简单
解题思路:
设计一个判断单个数是否是自除数的函数,比如取名为 IsSelfDIv()
IsSelfDIv函数的要点是:
排除数位中含有0的数
排除原数不是末位数字倍数的数
遍历原数列,对每一个数调用一次进行 IsSelfDIv 函数,将满足要求的加入List中即可
已 AC的代码为:
public class Solution
{
public IList<int> SelfDividingNumbers(int left, int right)
{
List<int> list = new List<int>();
for (int i = left; i <= right; ++i)
{
if (isSelfDiv(i))
list.Add(i);
}
return list;
}
bool isSelfDiv(int n)
{
if (n < 10)
return true;
if (n % 10 == 0)
return false;
int t = n;
while (t != 0)
{
int rem = t % 10;
if (rem == 0)
return false;
if (rem > 1 && n % rem != 0) // 原数不是末位数字倍数的数需要排除
return false;
t /= 10;
}
return true;
}
}运行结果:
执行用时: 244ms, 在所有 csharp 提交中击败了 100.00%的用户
相应的,如需测试,本地可执行的代码为:
using System;
using System.Collections.Generic;
namespace leetcode728
{
public class Solution
{
public IList<int> SelfDividingNumbers(int left, int right)
{
List<int> list = new List<int>();
for (int i = left; i <= right; ++i)
{
if (isSelfDiv(i))
list.Add(i);
}
return list;
}
bool isSelfDiv(int n)
{
if (n < 10)
return true;
if (n % 10 == 0)
return false;
int t = n;
while (t != 0)
{
int rem = t % 10;
if (rem == 0)
return false;
if (rem > 1 && n % rem != 0) // 原数不是末位数字倍数的数需要排除
return false;
t /= 10;
}
return true;
}
static void Main(string[] args)
{
var sol = new Solution();
var res = sol.SelfDividingNumbers(5, 50);
foreach (var item in res)
Console.WriteLine(item);
}
}
}相应代码已经上传到github:
https://github.com/yanglr/Leetcode-CSharp/tree/master/leetcode728
End
欢迎各位读者加入 .NET技术交流群,在公众号后台回复“加群”或者“学习”即可。


朕已阅 ![]()
本文深入解析LeetCode上的自除数问题,介绍了一种有效的算法实现,并提供了完整的C#代码示例。文章详细阐述了解题思路,包括设计判断单个数是否为自除数的函数,以及如何遍历区间内的所有数进行检查。
435

被折叠的 条评论
为什么被折叠?



