728. 自除数 题解

题目描述:728. 自除数 - 力扣(LeetCode)

自除数 是指可以被它包含的每一位数整除的数。

  • 例如,128 是一个 自除数 ,因为 128 % 1 == 0128 % 2 == 0128 % 8 == 0

自除数 不允许包含 0 。

给定两个整数 left 和 right ,返回一个列表,列表的元素是范围 [left, right] 内所有的 自除数 。

解题思路:

判断一个数是否是自除数:

利用取余操作符获得一个数的每一位,再用这个数除以获得每一个位,如果有一位不能被整除,这个数就不是自除数;反之,是自除数。

再利用循环就可以解答该题。

代码:

int* selfDividingNumbers(int left, int right, int* returnSize)
{
    int* arr = (int*)malloc(sizeof(int) * (right - left + 1));
    int j = 0;
    int count = 0;
    for (int i = left; i <= right; i++)
    {
        // 获得每一位数字,并判断
        int rem = i;
        int flag = 1;
        while (rem)
        {
            int temp = rem % 10;
            if (i % temp != 0)
                flag = 0;
            rem /= 10;
        }
        if (flag != 0)
        {
            arr[j++] = i;
            count++;
        }
    }
    *returnSize = count;
    return arr;
}

下面是我再解答这道题所犯的错误,读者可选择不看。

  • 第一个

int* selfDividingNumbers(int left, int right, int* returnSize)
{
    int* arr = (int*)malloc(sizeof(int) * (right - left + 1));
    int j = 0;
    int count = 0;
    for (int i = left; i <= right; i++)
    {
        // 获得每一位数字,并判断
        int rem = i;
        int flag = 1;
        while (i)
        {
            int temp = i % 10;
            if (rem % temp != 0)
                flag = 0;
            i /= 10;
        }
        if (flag != 0)
        {
            arr[j] = rem;
            j++;
            count++;
        }
    }
    *returnSize = count;
    return arr;
}

代码中的错误在于 while (i) 的循环条件。你在外层的 for 循环中使用了 i,而在内层的 while 循环中再次使用了 i。这导致了 for 循环中的 i 在内层循环中被改变,进而影响了外层的循环。

你应该在内层的 while 循环中使用另一个变量来保存数字的副本,而不是直接修改循环变量 i

  • 第二个

728. 自除数 题解_第1张图片

这个错误的原因是,我在 i % temp != 0 中没有考虑到 temp 可能为0的情况。当 temp 为0时,会导致整数除以0的异常,因此需要在判断条件中加入 temp == 0 的判断,以避免出现除以0的情况。

具体来说,当 temp 为0时,应该跳过检查,因为整数除以0是非法的操作。这就是为什么你需要在判断条件中包括 temp == 0 的原因。

所以,在判断是否是自除数的部分,应该将条件改为 temp == 0 || i % temp != 0,这样可以避免出现除以0的异常情况。

你可能感兴趣的:(算法,java,数据结构)