LeetCode in Kotlin

3848. Check Digitorial Permutation

Medium

You are given an integer n.

A number is called digitorial if the sum of the factorials of its digits is equal to the number itself.

Determine whether any permutation of n (including the original order) forms a digitorial number.

Return true if such a permutation exists, otherwise return false.

Note:

Example 1:

Input: n = 145

Output: true

Explanation:

The number 145 itself is digitorial since 1! + 4! + 5! = 1 + 24 + 120 = 145. Thus, the answer is true.

Example 2:

Input: n = 10

Output: false

Explanation:

10 is not digitorial since 1! + 0! = 2 is not equal to 10, and the permutation "01" is invalid because it starts with zero.

Constraints:

Solution

class Solution {
    fun isDigitorialPermutation(n: Int): Boolean {
        val factorials = IntArray(10)
        factorials[0] = 1
        for (d in 1..9) {
            factorials[d] = factorials[d - 1] * d
        }
        var digitsSum = 0
        var x = n
        do {
            digitsSum += factorials[x % 10]
            x /= 10
        } while (x != 0)
        return digitFrequencies(digitsSum).contentEquals(digitFrequencies(n))
    }

    companion object {
        fun digitFrequencies(x: Int): IntArray {
            var x = x
            val c = IntArray(10)
            do {
                c[x % 10]++
                x /= 10
            } while (x != 0)
            return c
        }
    }
}