算法小知识-----04.02-----自除数

133 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

清明时节雨纷纷,路上行人欲断魂,今晚是3天小长假的第一个晚上,但是也不能放松自己。

自除数

该题出自力扣的728题 —— 自除数【简单题】

审题

自除数 是指可以被它包含的每一位数整除的数。
例如,128 是一个 自除数 ,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。自除数 不允许包含 0 。
给定两个整数 left 和 right ,返回一个列表,列表的元素是范围 [left, right] 内所有的 自除数 。

输入: left = 1, right = 22
输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
  • 该题题意也是相对简单,就是给出一个整数,首先要确认该数是否自整数

    • 所谓的自整数,就是整数的本身可以除以每一个自身的数,并且没有余数
    • 以题意的128为例,128可以拆分为 1,2,8。128本身分别除以这三个数,并且没有余数,即可作为自除数
  • 题目中给出一个区间,left和right,在此区间内,为自除数的话,则返回,最终并且汇总成列表返回

  • 解题:

    • for循环遍历,从区间left到right
    • 定义一个check方法,专门来判断是否为自除数
      • 将整数除10,并且余10
      • 最终判断成为自除数
      • 重复该操作,直到当前整数变成 00 时即遍历了整数的每一位
    • 最终返回一个列表
  • 空间复杂度为O(1)

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

编码

class Solution {
    public List<Integer> selfDividingNumbers(int left, int right) {
        List<Integer> list = new ArrayList<>();
        for (int i = left; i <= right; i++) {
            if (check(i))list.add(i);
        }
        return list;
    }

    public Boolean check(int num){
        int a = num;
        while (a  != 0){
            int i = a % 10;
            if (i == 0 || num % i != 0)return false;
            a = a /10;
        }
        return true;
    }
}

image.png