Medium
A transaction is possibly invalid if:
$1000
, or;60
minutes of another transaction with the same name in a different city.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:
transactions.length <= 1000
transactions[i]
takes the form "{name},{time},{amount},{city}"
{name}
and {city}
consist of lowercase English letters, and have lengths between 1
and 10
.{time}
consist of digits, and represent an integer between 0
and 1000
.{amount}
consist of digits, and represent an integer between 0
and 2000
.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
}
}