All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g1101_1200.s1169_invalid_transactions.Solution Maven / Gradle / Ivy

package g1101_1200.s1169_invalid_transactions;

// #Medium #Array #String #Hash_Table #Sorting
// #2022_03_05_Time_11_ms_(89.89%)_Space_43.2_MB_(79.45%)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 * 1169 - Invalid Transactions\.
 *
 * Medium
 *
 * 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**.
 *
 * 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`
 * *   Each `transactions[i]` takes the form `"{name},{time},{amount},{city}"`
 * *   Each `{name}` and `{city}` consist of lowercase English letters, and have lengths between `1` and `10`.
 * *   Each `{time}` consist of digits, and represent an integer between `0` and `1000`.
 * *   Each `{amount}` consist of digits, and represent an integer between `0` and `2000`.
**/
public class Solution {
    public List invalidTransactions(String[] transactions) {
        Map> map = new HashMap<>();
        List result = new ArrayList<>();
        for (String transaction : transactions) {
            String[] split = transaction.split(",");
            String name = split[0];
            int time = Integer.parseInt(split[1]);
            String city = split[3];
            map.putIfAbsent(name, new TreeMap<>());
            map.get(name).put(time, new Transaction(time, city));
        }
        for (String transaction : transactions) {
            String[] split = transaction.split(",");
            String name = split[0];
            int time = Integer.parseInt(split[1]);
            int amount = Integer.parseInt(split[2]);
            String city = split[3];
            if (amount > 1000) {
                result.add(transaction);
                continue;
            }
            for (Map.Entry entry :
                    map.get(name).subMap(time - 60, time + 60).entrySet()) {
                if (Math.abs(time - entry.getKey()) <= 60 && !entry.getValue().city.equals(city)) {
                    result.add(transaction);
                    break;
                }
            }
        }
        return result;
    }

    private static class Transaction {
        int amount;
        String city;

        public Transaction(int amount, String city) {
            this.amount = amount;
            this.city = city;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy