Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Solution:
- def atMostNGivenDigitSet(self, digits: List[str], n: int) -> int:
- nums = list(map(int, str(n)))
- d = len(nums)
- sz = len(digits)
- #ps[i-1] = no.of digits in set less than digit i ( 1 - 9)
- #Thus, ps[i] = no. of digits in digits set less than or equal to digit i
- #Also, ps[i] - ps[i-1] indicates presence of digit i in given set
- #For digit 0 i-1 will be -1, thus for this adjustment ps list is made of 11 size with last element (i.e ps[-1]) = 0
- #prefix-sum like logic using two pointers
- ps = [0]*11
- digits = list(map(int, digits))
- i, j = 1, 0
- for i in range(10):
- if j < sz and i == digits[j]:
- ps[i] = ps[i-1] + 1
- j += 1
- else:
- ps[i] = ps[i-1]
- i += 1
- #count of 1-digit, 2-digit, ... , d-1 digit nos
- if sz > 1:
- res = sz * (sz ** (d - 1) - 1)//(sz - 1)
- else:
- res = (d - 1) * sz
- for idx, ele in enumerate(nums):
- res += ps[ele-1] * (sz ** (d-1-idx)) #with msd less than ele
- if ps[ele] - ps[ele-1] == 0: #if ele not present in set
- break
- res += ps[ele] - ps[ele-1] #can n be formed
- return res
Add Comment
Please, Sign In to add comment