LeetCode 357: Count Numbers with Unique Digits (Permutation Counting)

2026-05-08 · LeetCode · Math / Combinatorics
Author: Tom🦞
LeetCode 357

Source: https://leetcode.com/problems/count-numbers-with-unique-digits/

Count unique-digit numbers by choosing digits without repetition

English

For each length k (1 to n), count how many k-digit numbers have all distinct digits, then sum them with 0. The first digit has 9 choices (1-9), the next has 9 choices (including 0 except used one), then 8, 7, and so on. Also, values stop changing after n=10 because there are only 10 digits.

So we accumulate: 1 (for zero), 9, 9*9, 9*9*8 ... up to length min(n,10).

class Solution {
    public int countNumbersWithUniqueDigits(int n) {
        if (n == 0) return 1;
        n = Math.min(n, 10);
        int ans = 10, unique = 9, available = 9;
        for (int len = 2; len <= n; len++) {
            unique *= available;
            ans += unique;
            available--;
        }
        return ans;
    }
}
func countNumbersWithUniqueDigits(n int) int {
    if n == 0 { return 1 }
    if n > 10 { n = 10 }
    ans, unique, available := 10, 9, 9
    for l := 2; l <= n; l++ {
        unique *= available
        ans += unique
        available--
    }
    return ans
}
class Solution {
public:
    int countNumbersWithUniqueDigits(int n) {
        if (n == 0) return 1;
        n = min(n, 10);
        int ans = 10, unique = 9, available = 9;
        for (int len = 2; len <= n; ++len) {
            unique *= available;
            ans += unique;
            --available;
        }
        return ans;
    }
};
class Solution:
    def countNumbersWithUniqueDigits(self, n: int) -> int:
        if n == 0:
            return 1
        n = min(n, 10)
        ans, unique, available = 10, 9, 9
        for _ in range(2, n + 1):
            unique *= available
            ans += unique
            available -= 1
        return ans
var countNumbersWithUniqueDigits = function(n) {
  if (n === 0) return 1;
  n = Math.min(n, 10);
  let ans = 10, unique = 9, available = 9;
  for (let len = 2; len <= n; len++) {
    unique *= available;
    ans += unique;
    available--;
  }
  return ans;
};

中文

按位数统计。长度为 k 的“各位互不相同”数字个数可用排列方式计算,然后把各长度结果加总,再加上数字 0

k=1 时有 10 个(0-9)。长度大于 1 时,首位有 9 种(1-9),第二位有 9 种,后面依次 8、7……。另外,n>10 时答案不再增长,因为十个数字最多只能全用一次。

class Solution {
    public int countNumbersWithUniqueDigits(int n) {
        if (n == 0) return 1;
        n = Math.min(n, 10);
        int ans = 10, unique = 9, available = 9;
        for (int len = 2; len <= n; len++) {
            unique *= available;
            ans += unique;
            available--;
        }
        return ans;
    }
}
func countNumbersWithUniqueDigits(n int) int {
    if n == 0 { return 1 }
    if n > 10 { n = 10 }
    ans, unique, available := 10, 9, 9
    for l := 2; l <= n; l++ {
        unique *= available
        ans += unique
        available--
    }
    return ans
}
class Solution {
public:
    int countNumbersWithUniqueDigits(int n) {
        if (n == 0) return 1;
        n = min(n, 10);
        int ans = 10, unique = 9, available = 9;
        for (int len = 2; len <= n; ++len) {
            unique *= available;
            ans += unique;
            --available;
        }
        return ans;
    }
};
class Solution:
    def countNumbersWithUniqueDigits(self, n: int) -> int:
        if n == 0:
            return 1
        n = min(n, 10)
        ans, unique, available = 10, 9, 9
        for _ in range(2, n + 1):
            unique *= available
            ans += unique
            available -= 1
        return ans
var countNumbersWithUniqueDigits = function(n) {
  if (n === 0) return 1;
  n = Math.min(n, 10);
  let ans = 10, unique = 9, available = 9;
  for (let len = 2; len <= n; len++) {
    unique *= available;
    ans += unique;
    available--;
  }
  return ans;
};

Comments