デザイン地下鉄システム - 適切な容器を選択することの重要性

0x01の。問題

あなたは、クラス実装UndergroundSystem次の3つの方法をサポートしています。

  1. checkIn(int id, string stationName, int t)
    番号idでの乗客のt地下鉄の駅への時間stationName
    乗客は同時に地下鉄の駅を入力するか、残すことができます。
  2. checkOut(int id, string stationName, int t)
    番号idでの乗客のt地下鉄の駅を出る時stationName
  3. getAverageTime(string startStation, string endStation)
    リターン地下鉄駅からstartStation地下鉄の駅までendStationの平均時間を過ごしました。
    現在の日付を含むすべての平均旅行時間の計算startStation 直接到达 endStationストローク。
    通話getAverageTime時間は、ルートが少なくとも旅行の旅程が含まれてい尋ねます。

あなたがgetAverageTimeを呼び出すと、ルートが少なくとも旅行の旅程が含まれてい尋ねます。

あなたはすべてのためにと仮定してよいcheckIncheckOutの通話論理的です。つまり、顧客場合t1地下鉄駅の到着時間は、その後、彼の出発の時間がt2満たさなければなりませんt2 > t1すべてのイベントは時系列順に与えられています。

输入示例:
[「UndergroundSystem」、「チェックイン」、「チェックイン」、「チェックイン」、「チェックアウト」、「チェックアウト」、「チェックアウト」、「getAverageTime」、「getAverageTime」、「チェックイン」、「getAverageTime」、「チェックアウト」、 『getAverageTime』]
[]、[45、 『レイトン』、3]、[32、 『天国』、8]、[27、 『レイトン』、10]、[45、 『ウォータールー』、15]、 [27、「ウォータールー」、20]、[32、「ケンブリッジ」、22]、[「天国」、「ケンブリッジ」]、[「レイトン」、「ウォータールー」]、[10、「レイトン」、24]、 【「レイトン」、「ウォータールー」]、[10、「ウォータールー」、38]、[「レイトン」、「ウォータールー」]
输出示例:
[NULL、NULL、NULL、NULL、NULL、NULL、NULL、14.0、 11.0、ヌル、11.0、ヌル、12.0]
解释:
undergroundSystem undergroundSystem =新しいundergroundSystem()。
undergroundSystem.checkIn(45、「レイトン」、3);
undergroundSystem.checkIn(32、「天国」、8)。
undergroundSystem.checkIn(27、「レイトン」、10);
undergroundSystem.checkOut(45、 "ウォータールー"、15);
undergroundSystem.checkOut(27、 "ウォータールー"、20である);
undergroundSystem.checkOut(32、 "ケンブリッジ"、22である);
undergroundSystem.getAverageTime( "天国"、 "ケンブリッジ" ); //戻り14.0。"ケンブリッジ"旅行だけの旅(22時間)に"パラダイス"(時間8)から
undergroundSystem.getAverageTime( "レイトン"、 "ウォータールー "); // 11.0を返します。「ウォータールー」ストローク番号IDに「レイトン」から横たわっ2の合計=乗客45 = 3時間= 20リーチ始まる時間= 10に乗員27 =、時間= 15で番号IDを到着時から始まります。したがって、平均時間は、((15-3)+(20-10))/ 2 = 11.0
undergroundSystem.checkIn(10、 "レイトン"、24);
undergroundSystem.getAverageTime( "レイトン"、 "ウォータールー"); //戻り値11.0
undergroundSystem.checkOut(10、 "ウォータールー"、38である);
undergroundSystem.getAverageTime( "レイトン"、 "ウォータールー"); //戻り12.0

C++类形式:
class UndergroundSystem {
public:
    UndergroundSystem() {
        
    }
    
    void checkIn(int id, string stationName, int t) {
        
    }
    
    void checkOut(int id, string stationName, int t) {
        
    }
    
    double getAverageTime(string startStation, string endStation) {
        
    }
};
调用说明:

 * Your UndergroundSystem object will be instantiated and called as such:
 * UndergroundSystem* obj = new UndergroundSystem();
 * obj->checkIn(id,stationName,t);
 * obj->checkOut(id,stationName,t);
 * double param_3 = obj->getAverageTime(startStation,endStation);

注:この質問はLeetcode 182のゲーム第3週のトーナメントのタイトルから来ています

0×02。簡単な分析

慎重にタイトルを読んで、実際には、私はこの問題は、難しいことではないことがわかったが、それは次の場所に注意を払う必要があります。

  • ときにこれらの二つの局の口座に平均テイクを持つ2つのステーションがすべての行。
  • そこに同じ名前と並んで、複数のスタンド側であってもよいが、標準では、乗員のidの行を決定することであることがあります。
    あなたが基本的な考え方を持っていたら、この問題は、次の2つのアイデアを提供プラクティス、様々な構造を有することができます。

ACは、思考ゲームのコードで、効果が比較的貧弱である
という考えのコードのためのゲーム二つがうまく機能した後だと思います

0x03のアイデアの暴力 - コンテナの無差別使用

ゲーム中、時にはあまり考えることはできません、私はとてもシンプルなアイデアを望んでいた、問題は簡単です感じます。

  • 局名、IDに各ステーションにおいて、時間は、容器内に堆積されます。
  • ここでは、コンテナC Iのアイデアを入れ子にするために、コンテナの構造を指します。
  • 最後に、開始点を見つけるために、時間に二重のループを平均時間を算出し、その後、トラバーサルので、最後に移動してから、同じID情報が、もしあれば、計算されていないかを確認し、次の出発点を探して再起動すべての情報が保存されています。

この方法は非常に荒れている、非常に貧弱であると言うことができるが、ゲームは2Sで、以上であることが判明したとき。

  • このアプローチは、まず、そのような別の場所に保存されている事実であり、同じで駅名などスペースの不要な廃棄物の多くを引き起こし、間違ったコンテナを選択し、間違った場所です。
  • 第二に、二つの機能最初しかしデータが脳内に格納されていない、及びデータを処理しないように、最後の機能をもたらすことは、非常に時間がかかり、トラバースに大量のデータを必要とします。

ここでは、ゲームのコードACは次のとおりです。

class UndergroundSystem {
public:
    struct StationInformation {
        int id;
        int time;
    };
    struct station {
        string name;
        vector<struct StationInformation> p;
    };
    vector<struct station> All;
    UndergroundSystem() {

    }

    void checkIn(int id, string stationName, int t) {
        struct StationInformation informations;
        informations.id = id;
        informations.time = t;
        struct station c;
        c.name = stationName;
        c.p.push_back(informations);
        All.push_back(c);
    }

    void checkOut(int id, string stationName, int t) {
        struct StationInformation informations;
        informations.id = id;
        informations.time = t;
        struct station c;
        c.name = stationName;
        c.p.push_back(informations);
        All.push_back(c);
    }

    double getAverageTime(string startStation, string endStation) {
        vector<struct StationInformation> startSationInformation;
        vector<struct StationInformation> endStationInformation;
        double count = 0;
        double time = 0;
        for (int i = 0; i < All.size() - 1; i++) {
        ss:     if (All[i].name == startStation) {
                    startSationInformation = All[i].p;
                    for (int j = i + 1; j < All.size(); j++) {
                        if (All[j].name == endStation) {
                            endStationInformation = All[j].p;
                            for (int k = 0; k < startSationInformation.size(); k++) {
                                for (int h = 0; h < endStationInformation.size(); h++) {
                                    if (startSationInformation[k].id == endStationInformation[h].id) {
                                        time += endStationInformation[h].time - startSationInformation[k].time;
                                        count++;
                                        i++;
                                        goto ss;
                                    }
                                }
                            }
                        }
                    }
                }
        }
        return time / count;
    }
};

0x04を。使用してJiaoyouのアイデアとペアを-map

試合後、慎重に考えるとによって、そのを見つけたmappair、一緒に使用することができます。次のようにアイデアは以下のとおりです。

  • 地図ではtableid、駅や車のIDレコード上の特定の時間のために。
  • 録画するときに車が十分な長さ。
  • 下車し、私たちは地図を使用するresult複合文字列だけでなく、費やした時間、行数の開始点と終了点を記録し、。
  • トピックなので乗客がいる限り、すべての対応がライン上のIDを制御しなければならないとして、車の前に下車しなければならないことを示し、データの正当性を確保します。
  • tableidの形では:unordered_map<int, pair<string, int>> tableid;
  • resultの形では:unordered_map<string, pair<double, int>> result;

ここでは、コードは次のようになります。

class UndergroundSystem {
private:
    unordered_map<int, pair<string, int>> tableid;
    unordered_map<string, pair<double, int>> result;
public:
    UndergroundSystem() {

    }

    void checkIn(int id, string stationName, int t) {
        tableid[id] = { stationName ,t };
    }

    void checkOut(int id, string stationName, int t) {
        string name = tableid[id].first + stationName;
        t -= tableid[id].second;
        result[name].first += (double)t;
        result[name].second++;
    }

    double getAverageTime(string startStation, string endStation) {
        string name = startStation + endStation;
        return result[name].first / result[name].second;
    }
};

  • 両方のスペースの消費はほとんどですが、ギャップ時間は何十回もあります。
  • だから、データを保存するために適切な容器を選択することは非常に重要です。

ATFWUS --Writingにより、2020年3月29日

公開された160元の記事 ウォンの賞賛179 ・は 10000 +を見て

おすすめ

転載: blog.csdn.net/ATFWUS/article/details/105177723