kt: add «3272. Find the Count of Good Integers»

URL:	https://leetcode.com/problems/find-the-count-of-good-integers/
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
Matej Focko 2025-04-12 11:27:33 +02:00
parent aab8e6466e
commit 3b04cd9900
Signed by: mfocko
SSH key fingerprint: SHA256:icm0fIOSJUpy5+1x23sfr+hLtF9UhY8VpMC7H4WFJP8

View file

@ -0,0 +1,50 @@
class Solution {
private fun precomputeFactorial(n: Int): LongArray =
LongArray(n + 1) { 1 }.let { fs ->
(1..n).forEach { i ->
fs[i] = fs[i - 1] * i
}
fs
}
private fun countDigits(s: String): IntArray =
IntArray(10).let { digit ->
s.toCharArray().forEach { digit[it - '0']++ }
digit
}
private fun getPalindromes(
n: Int,
k: Int,
): Set<String> =
buildSet {
val base = (1..(n - 1) / 2).fold(1) { acc, _ -> acc * 10 }
val skip = n.and(1)
for (i in base..10 * base - 1) {
var s = i.toString()
s += StringBuilder(s).reverse().substring(skip)
val palindrome = s.toLong()
if (palindrome % k == 0L) {
val chars = s.toCharArray()
chars.sort()
add(String(chars))
}
}
}
fun countGoodIntegers(
n: Int,
k: Int,
): Long =
precomputeFactorial(n).let { factorial ->
getPalindromes(n, k).sumOf { s ->
val digit = countDigits(s)
val total = (n - digit[0]) * factorial[n - 1]
digit.fold(total) { total, count -> total / factorial[count] }
}
}
}