LeetCode 1169:クエリ無効取引(Invalid Transactions)解法要約
15481 ワード
文書ディレクトリ Solution
より多くのLeetCodeの問題解
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
Given a list of transactions, return a list of
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: Each Each Each Each
Solution
必ずstringのsplitをループの外に置いて先に処理し、ループ内に置くと、stringごとにsplit,TLEが複数回呼び出されます.
より多くのLeetCodeの問題解
A transaction is possibly invalid if:
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”]
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
. Solution
必ずstringのsplitをループの外に置いて先に処理し、ループ内に置くと、stringごとにsplit,TLEが複数回呼び出されます.
class Solution {
public:
vector<string> invalidTransactions(vector<string>& transactions) {
vector<vector<string> > transactionsSplited;
for(auto trans :transactions){
vector<string> transSplited;
SplitString(trans, transSplited, ",");
transactionsSplited.push_back(transSplited);
}
set<string> invalidTrans;
for(int i =0;i<transactionsSplited.size();i++){
bool flag = false;
for(int j = i+1;j<transactionsSplited.size();j++){
if(transactionsSplited[i][3] == transactionsSplited[j][3] || transactionsSplited[i][0] != transactionsSplited[j][0]){
continue;
}
if(abs(atoi(transactionsSplited[i][1].c_str())-atoi(transactionsSplited[j][1].c_str())) <= 60){
invalidTrans.insert(transactions[j]);
flag = true;
}
}
if(flag){
invalidTrans.insert(transactions[i]);
}
}
for(int i; i<transactionsSplited.size(); i++){
if(atoi(transactionsSplited[i][2].c_str()) > 1000){
invalidTrans.insert(transactions[i]);
}
}
vector<string> res;
for(auto s:invalidTrans){
res.push_back(s);
}
return res;
}
void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c)
{
std::string::size_type pos1, pos2;
pos2 = s.find(c);
pos1 = 0;
while(std::string::npos != pos2)
{
v.push_back(s.substr(pos1, pos2-pos1));
pos1 = pos2 + c.size();
pos2 = s.find(c, pos1);
}
if(pos1 != s.length())
v.push_back(s.substr(pos1));
}
};