A transaction is possibly invalid if: the amount exceeds $1000, or; if it occurs within (and including) 60 minutes of another transaction with the same name in a different city. Each transaction string transactions[i] consists of comma separated values representing the name, time (in minutes), amount, and city of the transaction. Given a list of transactions, 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"]
class Solution {
public List<String> invalidTransactions(String[] transactions) {
Set<String> set = new HashSet<String>();
Map<String, List<String[]>> map = new HashMap<>();
for(String s: transactions) {
String[] parts = s.split(",");
String name = parts[0];
String time = parts[1];
String amount = parts[2];
String city = parts[3];
if(Integer.valueOf(amount) > 1000) set.add(s);
if(map.containsKey(name)) {
for(String[] ss : map.get(name)) {
if(!city.equals(ss[3]) && Math.abs(Integer.valueOf(time) - Integer.valueOf(ss[1])) <= 60) {
set.add(s);
set.add(convert(ss));
}
}
}
if(!map.containsKey(name)) {
map.put(name, new ArrayList<>());
}
map.get(name).add(parts);
}
return new ArrayList<>(set);
}
private String convert(String[] parts) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < parts.length - 1; i++) {
sb.append(parts[i] + ",");
}
sb.append(parts[parts.length-1]);
return new String(sb);
}
}