C#刷遍Leetcode面试题系列连载(3): No.728 - 自除数

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

点击蓝字“dotNET匠人”关注我哟

加个“星标”,每日 7:15,好文必达!

640?

前言

前文传送门:

上篇文章中我们分析了一个递归描述的字符串问题,今天我们来分析一个数学问题,一道除法相关的面试题。

640?wx_fmt=png

今天要给大家分析的面试题是 LeetCode 上第 728 号问题,

LeetCode - 728. 自除数

https://leetcode-cn.com/problems/self-dividing-numbers/


题目描述

自除数 是指可以被它包含的每一位数除尽的数。

例如,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


  • 贡献者: 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


作者简介:Bravo Yeung计算机硕士,知乎干货答主(获81K 赞同, 37K 感谢, 234K 收藏)。曾在国内 Top3互联网视频直播公司短暂工作过,后加入一家外企做软件开发至今。

欢迎各位读者加入 .NET技术交流群,在公众号后台回复“加群”或者“学习”即可。

640?wx_fmt=gif

640?wx_fmt=jpeg

朕已阅 640?

内容概要:本资源聚焦于配电网在发生故障后的两阶段鲁棒恢复研究,旨在提升电力系统在不确定性条件下的恢复能力与运行可靠性。研究采用两阶段优化方法,第一阶段进行预恢复决策,如网络重构、分布式电源出力调整等,以最小化预期损失;第二阶段则针对实际发生的故障场景实施校正控制,利用鲁棒优化理论应对负荷波动、新能源出力不确定性等因素,确保恢复方案的可行性与强健性。资源提供了完整的Matlab代码实现,复现了相关顶刊研究成果,便于使用者深入理解模型构建、算法求解及仿真分析全过程。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、科研人员及电力行业工程师。; 使用场景及目标:① 学习并掌握配电网故障恢复的先进优化方法,特别是两阶段鲁棒优化模型的构建与应用;② 复现和验证顶刊论文中的算法,为自身科研工作提供技术参考和代码基础;③ 将所学方法拓展应用于微电网、主动配电网等新型电力系统的可靠性评估与优化调度研究。; 阅读建议:学习者应结合提供的Matlab代码,仔细研读模型的数学公式与求解逻辑,重点关注不确定性建模、两阶段决策变量的设定以及鲁棒对等转换技巧。建议在掌握基础案例后,尝试修改参数或引入新的约束条件进行扩展研究,以深化理解并提升创新能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值