DEV Community

codingpineapple
codingpineapple

Posted on

2 1

LeetCode 1169. Invalid Transactions (javascript solution)

Description:

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.

Solution:

Time Complexity : O(n^2)
Space Complexity: O(n)

const isInvalid = (transaction, map) => {
  const [name, time, amount, city] = transaction.split(',')

  if (amount > 1000) return true

  const prevTrans = map[name]

  for (const trans of prevTrans) {
    if (city !== trans.city && Math.abs(time - trans.time) <= 60) return true
  }

    return false
}

const invalidTransactions = transactions => {
  const invalid = []
  const map = {}

  // Sepearate transactions by name
  for (const trans of transactions) {
    const [name, time, amount, city] = trans.split(',')

    // Create a list of transactions under each name
    if (name in map) map[name].push({ time, city })
    else map[name] = [{ time, city }]
  }

  // Validate transactions
  for (const trans of transactions) {    
    if (isInvalid(trans, map)) invalid.push(trans)
  }

  return invalid
};
Enter fullscreen mode Exit fullscreen mode

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (2)

Collapse
 
cjleverett profile image
CJLeverett

I don't get it, I did something almost exactly the same but not sure why it won't pass.

function invalidTransactions(transactions) {
  const review = {};
  const invalidTransactions = [];

  for (const t of transactions) {
    const [name, time, , city] = t.split(',');

    if (name in review) review[name].push({ time, city });
    else review[name] = [{ time, city }];
  }

  for (const transaction of transactions) {
    const [name, time, amount, city] = transaction.split(',');
    const prevTransactions = review[name];

    if (amount > 1000) {
      invalidTransactions.push(transaction);
    }

    for (const prevTransaction of prevTransactions) {
      const { time: prevTime, city: prevCity } = prevTransaction;

      if (city !== prevCity && Math.abs(time - prevTime) <= 60) {
        invalidTransactions.push(transaction);
      }
    }
  }

  return Array.from(invalidTransactions);
}
Enter fullscreen mode Exit fullscreen mode
Collapse
 
radoncreep profile image
radoncreep

nice

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay