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);
    }
}

results matching ""

    No results matching ""