Self Dividing Numbers

An easy problem to finish the week, from LeetCode: https://leetcode.com/problems/self-dividing-numbers/description/:

self-dividing number is a number that is divisible by every digit it contains.
For example, 128 is a self-dividing number because 128 % 1 == 0128 % 2 == 0, and 128 % 8 == 0.
Also, a self-dividing number is not allowed to contain the digit zero.
Given a lower and upper number bound, output a list of every possible self dividing number, including the bounds if possible.
Example 1:
Input: 
left = 1, right = 22
Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]

Given the low ranges for the input, a simple check across all the digits for each number in the range should do it. The main logic is highlighted in green below. Basically to check whether a given number is self-dividing, go thru its digits (that's the module ten in the code) and if the digit is zero or if it doesn't divide the number, then the number is not self-dividing. Otherwise, it is. Very simple. Code is down below.
Oh, and this happened last week, at The Crocodile in Seattle! Hope you enjoy!!! Marcelo



public class Solution
{
public IList<int> SelfDividingNumbers(int left, int right)
{
List<int> retVal = new List<int>();

for (int i = left; i <= right; i++)
if (IsSelfDividingNumber(i)) retVal.Add(i);

return retVal;
}

private bool IsSelfDividingNumber(int n)
{
int temp = n;
while (temp > 0)
{
int d = temp % 10;
if (d == 0 || n % d != 0) return false;
temp /= 10;
}

return true;
}
}

Comments

  1. I also decided to not overthink this problem and ended up with pretty much identical solution:

    class Solution {
    private:
    bool selfDividing(int number) {
    for (int tmp = number; tmp > 0; tmp /= 10) {
    int digit = tmp % 10;
    if (digit == 0 || number % digit != 0) return false;
    }
    return true;
    }
    public:
    vector selfDividingNumbers(int left, int right) {
    vector numbers;
    for (int number = left; number <= right; number += 1) {
    if (selfDividing(number)) numbers.push_back(number);
    }
    return numbers;
    }
    };

    I there was a time distribution available (current it's not because of too few submissions) I would see if it makes sense to perform some small optimizations :)

    Have a splendid weekend!

    ReplyDelete
    Replies
    1. Awesome yeah not too many submissions yet. Have a good one my dear friend!

      Delete

Post a Comment

Popular posts from this blog

Changing the root of a binary tree

Prompt Engineering and LeetCode

ProjectEuler Problem 719 (some hints, but no spoilers)