Self Dividing Numbers
An easy problem to finish the week, from LeetCode: https://leetcode.com/problems/self-dividing-numbers/description/:
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;
}
}
A 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 == 0
, 128 % 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.
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;
}
}
I also decided to not overthink this problem and ended up with pretty much identical solution:
ReplyDeleteclass 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!
Awesome yeah not too many submissions yet. Have a good one my dear friend!
Delete