自除数

236 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

  • 自除数 **是指可以被它包含的每一位数整除的数。
    • 例如,128 是一个 自除数 ,因为 128 % 1 == 0128 % 2 == 0128 % 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 <= 10000

二、思路分析:

  • 给定的leftright都是自然数的取值范围,但是其中包含非自然数,需要做的,就是在这个范围中去掉那些非自然数
  • 根据给定的范围遍历,首先题目描述,排除10的倍数,因为10的倍数都包含0
  • 然后将当前范围内的数转化为字符串数组,数组内每一项对应这个数的每一位上的值
  • 遍历数组,如果数组中有一项不满足该数字模以当前数组项的项为0,就说明当前这个数字不是自然数,退出当前循环
  • 如果找到了数组的最后一项,并且最后一项满足该数字模以当前数组项的项为0,说明整个数组都满足,那么这个数字就是自然数,将这个数字添加到定义好保存结果的数组中

三、AC 代码:

function selfDividingNumbers(left: number, right: number): number[] {
    let resultArr: Array<number> = [];
    for(let i = left; i <= right; i++){
        if(i % 10 !== 0){
            let str = i.toString().split('');
            for(let j = 0; j < str.length; j++){
                if(i % Number(str[j]) !== 0) break;
                if(j === str.length - 1 && i % Number(str[j]) === 0){
                    resultArr.push(i);
                }
            }
        }
    }
    return resultArr
};

四、总结:

  • 题目简单难度,需要注意下break的使用,只要有一个不满足,立即退出循环,不需要执行后面的遍历
  • 更多解题方式,移步题解区

image.png