leetcode刷题记录之728

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,那么相等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值