LeetCode in Kotlin

1169. Invalid Transactions

Medium

A transaction is possibly invalid if:

You are given an array of strings transaction where transactions[i] consists of comma-separated values representing the name, time (in minutes), amount, and city of the transaction.

Return a list of transactions that are possibly invalid. You may return the answer in any order.

Example 1:

Input: transactions = [“alice,20,800,mtv”,”alice,50,100,beijing”]

Output: [“alice,20,800,mtv”,”alice,50,100,beijing”]

Explanation: The first transaction is invalid because the second transaction occurs within a difference of 60 minutes, have the same name and is in a different city. Similarly the second one is invalid too.

Example 2:

Input: transactions = [“alice,20,800,mtv”,”alice,50,1200,mtv”]

Output: [“alice,50,1200,mtv”]

Example 3:

Input: transactions = [“alice,20,800,mtv”,”bob,50,1200,mtv”]

Output: [“bob,50,1200,mtv”]

Constraints:

Solution

class Solution {
    internal class Transaction(trans: String) {
        var name: String
        var time: Int
        var amount: Int
        var city: String

        init {
            val s = trans.split(",".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
            name = s[0]
            time = s[1].toInt()
            amount = s[2].toInt()
            city = s[3]
        }
    }

    fun invalidTransactions(input: Array<String>?): List<String> {
        val res: MutableList<String> = ArrayList()
        if (input == null || input.size == 0) {
            return res
        }
        val map: MutableMap<String, MutableList<Transaction>> = HashMap()
        for (s in input) {
            val trans = Transaction(s)
            if (!map.containsKey(trans.name)) {
                map[trans.name] = ArrayList()
            }
            map.getValue(trans.name).add(trans)
        }
        for (s in input) {
            val trans = Transaction(s)
            if (!isValid(trans, map)) {
                res.add(s)
            }
        }
        return res
    }

    private fun isValid(transaction: Transaction, map: Map<String, MutableList<Transaction>>): Boolean {
        if (transaction.amount > 1000) {
            return false
        }
        for (s in map.getValue(transaction.name)) {
            if (Math.abs(s.time - transaction.time) <= 60 && s.city != transaction.city) {
                return false
            }
        }
        return true
    }
}