LeetCode 357: Count Numbers with Unique Digits (Permutation Counting)
LeetCode 357Source: https://leetcode.com/problems/count-numbers-with-unique-digits/
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 ansvar 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 ansvar 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