DeepRest

Numbers At Most N Given Digit Set

Dec 18th, 2021 (edited)
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.33 KB | None | 0 0
  1. class Solution:
  2.     def atMostNGivenDigitSet(self, digits: List[str], n: int) -> int:
  3.         nums = list(map(int, str(n)))
  4.         d = len(nums)
  5.         sz = len(digits)
  6.        
  7.         #ps[i-1] = no.of digits in set less than digit i ( 1 - 9)
  8.         #Thus, ps[i] = no. of digits in digits set less than or equal to digit i
  9.         #Also, ps[i] - ps[i-1] indicates presence of digit i in given set
  10.         #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
  11.        
  12.         #prefix-sum like logic using two pointers
  13.         ps = [0]*11
  14.         digits = list(map(int, digits))
  15.         i, j = 1, 0
  16.         for i in range(10):
  17.             if j < sz and i == digits[j]:
  18.                 ps[i] = ps[i-1] + 1
  19.                 j += 1
  20.             else:
  21.                 ps[i] = ps[i-1]
  22.             i += 1
  23.        
  24.         #count of 1-digit, 2-digit, ... , d-1 digit nos
  25.         if sz > 1:
  26.             res = sz * (sz ** (d - 1) - 1)//(sz - 1)
  27.         else:
  28.             res = (d - 1) * sz
  29.        
  30.         for idx, ele in enumerate(nums):
  31.             res += ps[ele-1] * (sz ** (d-1-idx)) #with msd less than ele
  32.             if ps[ele] - ps[ele-1] == 0: #if ele not present in set
  33.                 break  
  34.         res += ps[ele] - ps[ele-1] #can n be formed
  35.         return res
Add Comment
Please, Sign In to add comment