728、自除数
自除数是指可以被它包含的每一位数除尽的数。
例如,128 是一个自除数,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。
还有,自除数不允许包含 0 。
给定上边界和下边界数字,输出一个列表,列表的元素是边界(含边界)内所有的自除数。
示例 1:
输入: 上边界left = 1, 下边界right = 22
输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
注意:
- 每个输入参数的边界满足 1 <= left <= right <= 10000。
难度:简单 题目地址:https://leetcode-cn.com/problems/self-dividing-numbers/
1、C语言代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* selfDividingNumbers(int left, int right, int* returnSize) {
int *result = (int *)malloc(sizeof(int) * (right - left + 1));
*returnSize = 0;
for (int v, d; left <= right; ++left) {
v = left;
while (v > 0) {
d = v % 10;
if (d == 0 || left % d != 0) {
break;
}
v /= 10;
}
if (v == 0) {
result[*returnSize] = left;
*returnSize += 1;
}
}
return result;
}
解释:
- 遍历从left到right到每个数。
- 如果这个数符合要求,把它添加到输出列表中。
- 如何判断是否符合要求?
- 设置一个临时变量等于这个原数。
- 每次让临时变量对10取余,即是临时变量的末尾,比如128对10取余的结果是8。
- 判断原数对这个余数是否能整除,不能就直接break了,进入下一个数。
- 临时变量对自己整除10,比如128整除10就是12了,这样再下个循环中取余就是2
- 注意两点。
- 取余数后要先判断是否等于0,因为没有办法对0求余数。注意or 运算先算左边再算右边,顺序不能错咯。
- 设置一个临时变量是否等于0的判断,来鉴别while是被break了还是正常结束。
知识点回顾:
C语言动态分配内存:
(1) malloc()、calloc()
分配新的内存区域。
(2) realloc()
调整已分配的内存区域。
(3) free()
释放已分配的内存区域。
2、Java代码:
class Solution {
public List<Integer> selfDividingNumbers(int left, int right) {
List<Integer> ans = new ArrayList<Integer>();
for(int i = left; i <= right; i++){
boolean isMatch = true;
int k = i;
while(k != 0){
int val = k % 10;
if(val == 0 || i % val != 0){
isMatch = false;
break;
}
k /= 10;
}
if(isMatch){
ans.add(i);
}
}
return ans;
}
}
解释: 类似于C语言的求解思路。
知识点回顾: 无。
3、Python代码:
class Solution:
def selfDividingNumbers(self, left: int, right: int) -> List[int]:
ans = []
for num in range(left,right + 1):
copy = num
while copy > 0:
div, copy = copy % 10, copy // 10
if div == 0 or num % div != 0: break
else: ans.append(num) # while … else 在循环条件为 false 时执行 else 语句块
return ans
解释: 类似于C语言的求解思路。
知识点回顾:
1、range() 函数可创建一个整数列表,一般用在 for 循环中。
语法:range(start, stop[, step])
start:计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop:计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)3
4、JavaScript代码:
/**
* @param {number} left
* @param {number} right
* @return {number[]}
*/
var selfDividingNumbers = function(left, right) {
var res = [];
var str, num, flag;
for(;left <= right;left++){
flag = true
str = String(left);
for(var i = 0;i < str.length;i++){
num = Number(str[i]);
if(num === 0 || left % num !== 0){
flag = false;
break;
}
}
if(flag){
res.push(left);
}
}
return res;
};
解释: 类似于C语言的求解思路。
知识点回顾:
1、push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
注意: 新元素将添加在数组的末尾。
注意: 此方法改变数组的长度。
提示: 在数组起始位置添加元素请使用 unshift() 方法。
语法:array.push(item1, item2, …, itemX)
item1, item2, …, itemX:必需。要添加到数组的元素。
返回值:Number,数组新长度。
2、JavaScript中==和===的区别:
双等号==:
(1)如果两个值类型相同,再进行三个等号(===)的比较。
(2)如果两个值类型不同,也有可能相等,需根据以下规则进行类型转换在比较:
1)如果一个是null,一个是undefined,那么相等。
2)如果一个是字符串,一个是数值,把字符串转换成数值之后再进行比较。
三等号===:
(1)如果类型不同,就一定不相等
(2)如果两个都是数值,并且是同一个值,那么相等;如果其中至少一个是NaN,那么不相等。(判断一个值是否是NaN,只能使用isNaN( ) 来判断)
(3)如果两个都是字符串,每个位置的字符都一样,那么相等,否则不相等。 (4)如果两个值都是true,或是false,那么相等。
(5)如果两个值都引用同一个对象或是函数,那么相等,否则不相等。
(6)如果两个值都是null,或是undefined,那么相等。