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:
parent
aab8e6466e
commit
3b04cd9900
1 changed files with 50 additions and 0 deletions
50
kt/find-the-count-of-good-integers.kt
Normal file
50
kt/find-the-count-of-good-integers.kt
Normal 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] }
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue