Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
- 自除数 **是指可以被它包含的每一位数整除的数。
- 例如,
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 <= 10000
二、思路分析:
- 给定的
left和right都是自然数的取值范围,但是其中包含非自然数,需要做的,就是在这个范围中去掉那些非自然数 - 根据给定的范围遍历,首先题目描述,排除
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的使用,只要有一个不满足,立即退出循环,不需要执行后面的遍历 - 更多解题方式,移步题解区