LeetCode Solutions

902. Numbers At Most N Given Digit Set

Time: $O(\log n)$

Space: $O(\log n)$

			

class Solution {
 public:
  int atMostNGivenDigitSet(vector<string>& D, int N) {
    int ans = 0;
    string num = to_string(N);

    for (int i = 1; i < num.length(); ++i)
      ans += pow(D.size(), i);

    for (int i = 0; i < num.length(); ++i) {
      bool dHasSameNum = false;
      for (const string& digit : D) {
        if (digit[0] < num[i])
          ans += pow(D.size(), num.length() - i - 1);
        else if (digit[0] == num[i])
          dHasSameNum = true;
      }
      if (!dHasSameNum)
        return ans;
    }

    return ans + 1;
  }
};
			

class Solution {
  public int atMostNGivenDigitSet(String[] D, int N) {
    int ans = 0;
    String num = String.valueOf(N);

    for (int i = 1; i < num.length(); ++i)
      ans += Math.pow(D.length, i);

    for (int i = 0; i < num.length(); ++i) {
      boolean dHasSameNum = false;
      for (final String digit : D) {
        if (digit.charAt(0) < num.charAt(i))
          ans += Math.pow(D.length, num.length() - i - 1);
        else if (digit.charAt(0) == num.charAt(i))
          dHasSameNum = true;
      }
      if (!dHasSameNum)
        return ans;
    }

    return ans + 1;
  }
}
			

class Solution:
  def atMostNGivenDigitSet(self, D: List[str], N: int) -> int:
    ans = 0
    num = str(N)

    for i in range(1, len(num)):
      ans += len(D)**i

    for i, c in enumerate(num):
      dHasSameNum = False
      for digit in D:
        if digit < c:
          ans += len(D)**(len(num) - i - 1)
        elif digit == c:
          dHasSameNum = True
      if not dHasSameNum:
        return ans

    return ans + 1