当前位置: 首页 > news >正文

经典算法实例应用:自除数

我们先来看题目描述:

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

例如,128 是一个 自除数 ,因为 128 % 1 == 0 ,128 % 2 == 0 ,128 % 8 == 0 。

自除数 不允许包含 0 。

给定两个整数 left 和 right ,返回一个列表,列表的元素是范围 [left, right] 内所有的自除数 。

示例 1:

输入:left = 1, right = 22 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]

示例 2:

输入:left = 47, right = 85 输出:[48,55,66,77]

提示:

  • 1 <= left <= right <= 104

解决方案

方法一:直接判断

遍历范围[left,right] 内的所有整数,分别判断每个整数是否为自除数。

根据自除数的定义,如果一个整数不包含 0 且能被它包含的每一位数整除,则该整数是自除数。判断一个整数是否为自除数的方法是遍历整数的每一位,判断每一位数是否为 0 以及是否可以整除该整数。

遍历整数的每一位的方法是,每次将当前整数对 10 取模即可得到当前整数的最后一位,然后将整数除以 10。重复该操作,直到当前整数变成 0 时即遍历了整数的每一位。

代码

Python3

class Solution: def selfDividingNumbers(self, left: int, right: int) -> List[int]: def isSelfDividing(num: int) -> bool: x = num while x: x, d = divmod(x, 10) if d == 0 or num % d: return False return True return [i for i in range(left, right + 1) if isSelfDividing(i)]

Java

class Solution { public List<Integer> selfDividingNumbers(int left, int right) { List<Integer> ans = new ArrayList<Integer>(); for (int i = left; i <= right; i++) { if (isSelfDividing(i)) { ans.add(i); } } return ans; } public boolean isSelfDividing(int num) { int temp = num; while (temp > 0) { int digit = temp % 10; if (digit == 0 || num % digit != 0) { return false; } temp /= 10; } return true; } }

C#

public class Solution { public IList<int> SelfDividingNumbers(int left, int right) { IList<int> ans = new List<int>(); for (int i = left; i <= right; i++) { if (IsSelfDividing(i)) { ans.Add(i); } } return ans; } public bool IsSelfDividing(int num) { int temp = num; while (temp > 0) { int digit = temp % 10; if (digit == 0 || num % digit != 0) { return false; } temp /= 10; } return true; } }

C++

class Solution { public: bool isSelfDividing(int num) { int temp = num; while (temp > 0) { int digit = temp % 10; if (digit == 0 || num % digit != 0) { return false; } temp /= 10; } return true; } vector<int> selfDividingNumbers(int left, int right) { vector<int> ans; for (int i = left; i <= right; i++) { if (isSelfDividing(i)) { ans.emplace_back(i); } } return ans; } };

复杂度分析

时间复杂度:O(n log right) ,其中 n 是范围内的整数个数,right 是范围内的最大整数。对于范围内的每个整数,需要 O(log right) 的时间判断是否为自除数。

空间复杂度:O(1) 。除了返回值以外,使用的额外空间为 O(1) 。

http://www.jsqmd.com/news/1200816/

相关文章:

  • Windows 10 PL-2303驱动终极修复指南:让停产芯片重获新生
  • 六层板地层乱分割-硬件工程师都踩过的回流路径陷阱
  • 掌握Loop Engineering,让AI自动生成内容流水线(小白也能轻松上手)
  • VSCode + Rust-analyzer:打造高效智能的Rust开发工作流
  • 如何利用ConfuserEx控制流混淆技术保护你的.NET代码安全
  • Claude Code Agent Team:AI多代理协作开发实战指南
  • 鸿蒙三方库 | harmony-utils之NetworkUtil 5G支持与信号强度详解
  • RT-Thread Nano与NTP协议在嵌入式时间同步中的应用
  • AI模型上线≠产品上线:资深架构师亲授的4层验证漏斗——让AI功能首周留存率提升至68.5%
  • 跨境手机壳、印花服饰避坑:游戏手柄无缝涂鸦插画版权自查实操步骤
  • Magic VLSI布局工具:从芯片设计新手到专家的完整指南
  • 5分钟免费获取专业足球数据:Understat异步Python包的终极指南
  • CANN/asc-devkit Ascend C SIMD API GetBlockIdx函数文档
  • 3个核心功能解决远程BT下载管理难题:Transmission Remote GUI完整指南
  • Wand-Enhancer终极指南:如何免费解锁WeMod完整功能并实现手机远程控制
  • “Ctrl+C/V”时代终结?2024Q2企业调研显示:启用AI Excel功能的团队错误率下降68%,你还在等什么?
  • 劳力士中国大陆官方售后服务中心|官网认证电话及地址权威公示(2026年7月最新) - 亨得利客户服务中心
  • 猫抓Cat-Catch 2.7.0:浏览器资源嗅探的终极利器,轻松下载网络媒体资源
  • 为什么选择x2nestos?5大核心优势让openEuler转NestOS更简单
  • YimMenu完整指南:如何用免费开源工具提升GTA5游戏体验与安全防护
  • 新手3分钟上手,老手惊呼“早该知道”——Canva AI视频编辑的9个反常识工作流(内部培训文档流出)
  • 5分钟快速上手:Windows 7 SP2终极更新指南,让经典系统重获新生
  • 【小程序课程设计/毕业设计】民宿智能排班入住系统的设计与实现 基于 SpringBoot + 微信小程序的轻量化民宿预订管理系统【附源码、数据库、万字文档】
  • 小白/程序员必看:如何避免踩坑,成功拥抱医疗大模型浪潮?
  • HeyGen翻译API调用成本骤降61%的冷启动优化术,含真实企业账单对比图与Token精算公式
  • 大语料集训练词向量的工程实践:从Word2Vec到领域适配
  • 3步让你的Mac鼠标滚动如丝般顺滑:SSD硬盘都羡慕的流畅体验
  • 硬件与SI工程师协作:高速PCB设计实践
  • Windows安卓应用安装终极指南:APK安装器完整使用教程
  • 白上吹雪主题鼠标指针安装指南:Windows系统个性化定制教程