C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++での無効なトランザクション


いくつかのトランザクションがあるとします。 -

の場合、トランザクションは無効である可能性があります
  • 金額が$1000を超える、または;

  • 別の都市で同じ名前の別の取引から60分以内に発生した場合(およびそれを含む場合)。

ここで、各トランザクション文字列transactions [i]は、トランザクションの名前、時間(分単位)、金額、および都市を表すコンマ区切りの値で構成されます。トランザクションのリストがあり、無効である可能性のあるトランザクションのリストを見つけます。したがって、入力が["alice、20,800、mtv"、 "bob、50,1200、mtv"]の場合、答えは["bob、50,1200、mtv"]になります。

これを解決するには、次の手順に従います-

  • セットを定義します。マップを定義するm

  • 0からt–1のサイズの範囲のiの場合

    • x:=t [i]

    • temp:=文字列xを使用するノード

    • 0からmのサイズまでの範囲のjの場合[温度の名前]

      • y:=m[臨時雇用者の名前][j]

      • yの都市が臨時雇用者の都市ではなく|yの時間–臨時雇用者の時間| − =60

        • ノードyを文字列としてセットsに挿入し、xをsに挿入します

    • 温度が1000を超える場合は、xをsに挿入します

    • tempをm[tempの名前]

      に挿入します
  • セット内のアイテムを返す

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Node{
   public:
   string name;
   string city;
   int time;
   int amount;
};
class Solution {
   public:
   Node getNode(string s){
      string temp = "";
      Node ret;
      int cnt = 0;
      for(int i = 0; i < s.size(); i++){
         if(s[i] == ','){
            if(cnt == 0){
               ret.name = temp;
            }
            else if(cnt == 1){
               ret.time = stoi(temp);
            }
            else if(cnt == 2){
               ret.amount = stoi(temp);
            } else {
               ret.city = temp;
            }
            cnt++;
            temp = "";
            continue;
         }
         temp += s[i];
      }
      ret.city = temp;
      return ret;
   }
   vector<string> invalidTransactions(vector<string>& t) {
      set <string >s;
      map <string ,vector < Node >> m;
      for(int i = 0; i < t.size(); i++){
         string x = t[i];
         Node temp = getNode(x);
         for(int j = 0; j < m[temp.name].size(); j++){
            Node y = m[temp.name][j];
            if(y.city != temp.city && abs(y.time - temp.time) <= 60){
               s.insert(y.name + "," + to_string(y.time) + "," + to_string(y.amount) + "," + y.city);
               s.insert(x);
            }
         }
         if(temp.amount > 1000){
            s.insert(x);
         }
         m[temp.name].push_back(temp);
      }
      vector <string> ret(s.begin(), s.end());
      return ret;
   }
};
main(){
   vector<string> v1 = {"alice,20,800,mtv","bob,50,1200,mtv"};
   Solution ob;
   print_vector(ob.invalidTransactions(v1));
}

入力

["alice,20,800,mtv","bob,50,1200,mtv"]

出力

[bob,50,1200,mtv, ]

  1. C++でのスレッド化された二分木の順序のないトラバーサル

    ここでは、スレッド化された二分木データ構造を確認します。二分木ノードには最大で2つの子が存在する可能性があることがわかっています。ただし、子が1つしかない場合、または子がない場合、リンクリスト表現のリンク部分はnullのままになります。スレッド化された二分木表現を使用して、いくつかのスレッドを作成することにより、その空のリンクを再利用できます。 1つのノードに空いている左または右の子領域がある場合、それはスレッドとして使用されます。スレッド化された二分木には2つのタイプがあります。シングルスレッドツリーまたはフルスレッドバイナリツリー。 完全にスレッド化されたバイナリツリーの場合、各ノード

  2. C++での組み合わせ

    2つの整数nとkがあるとします。 1...nからk個の可能なすべての組み合わせを見つける必要があります。したがって、n=4およびk=2の場合、組み合わせは[[1,2]、[1,3]、[1,4]、[2,3]、[2,4]、[3,4 ]] これを解決するには、次の手順に従います- これを解決するために再帰関数を使用します。関数solve()は、n、k、一時配列を取得して開始します。開始は最初は1です。これは次のように動作します temp配列のサイズ=kの場合、tempをres配列に挿入し、戻ります for i:=start to n、 iを一時的に挿入 solve(n、k、temp、i + 1