这是悦乐书的第 305 次更新, 第 324 篇原创
01 看题和准备
今天介绍的是 LeetCode 算法题中 Easy 级别的第 173 题 (顺位题号是 728). 自分割数是一个可被其包含的每个数字整除的数字. 例如, 128 是自分割数, 因为 128%1 == 0,128%2 == 0,128%8 == 0. 此外, 不允许自分割数包含数字零. 给定数字的下限和上限, 输出每个可能的自分割数的数组, 如果可能, 包括边界. 例如:
输入: left = 1,right = 22
输出:[1,2,3,4,5,6,7,8,9,11,12,15,22]
注意: 每个输入参数的边界是 1 <= left <= right <= 10000.
本次解题使用的开发工具是 eclipse,jdk 使用的版本是 1.8, 环境是 win7 64 位系统, 使用 Java 语言编写和测试.
02 第一种解法
此题要求找出给定范围内所有符合要求的自分割数, 直接将题目意思翻译过来就行, 单独写了一个判断是否是自分割数的判断方法.
- public List<Integer> selfDividingNumbers(int left, int right) {
- List<Integer> list = new ArrayList<Integer>();
- for (int i=left; i<=right; i++) {
- if (isSelfDividing(i)) {
- list.add(i);
- }
- }
- return list;
- }
- public boolean isSelfDividing(int num){
- char[] arr = (num+"").toCharArray();
- for (char ch : arr) {
- if (ch == '0' || num%(ch-'0') != 0) {
- return false;
- }
- }
- return true;
- }
03 第二种解法
我们也可以直接在一个方法里面完成, 第一种解法是转成字符数组来判断, 此解法是利用取余和整除结合来取每一位数.
- public List<Integer> selfDividingNumbers(int left, int right) {
- List<Integer> list = new ArrayList<Integer>();
- for (int i=left; i<=right; i++) {
- int num = 0;
- for (num=i; num>0; num/=10) {
- if (num%10 == 0 || i%(num%10) != 0) {
- break;
- }
- }
- if (num == 0) {
- list.add(i);
- }
- }
- return list;
- }
04 小结
算法专题目前已日更超过五个月, 算法题文章 173 + 篇, 公众号对话框回复 [数据结构与算法] ,[算法] ,[数据结构] 中的任一关键词, 获取系列文章合集.
以上就是全部内容, 如果大家有什么好的解法思路, 建议或者其他问题, 可以下方留言交流, 点赞, 留言, 转发就是对我最大的回报和支持!
来源: http://www.jianshu.com/p/790e65b2c117