0x01の。問題
あなたは、クラス実装UndergroundSystem
次の3つの方法をサポートしています。
checkIn(int id, string stationName, int t)
:
番号id
での乗客のt
地下鉄の駅への時間stationName
。
乗客は同時に地下鉄の駅を入力するか、残すことができます。checkOut(int id, string stationName, int t)
:
番号id
での乗客のt
地下鉄の駅を出る時stationName
。getAverageTime(string startStation, string endStation)
:
リターン地下鉄駅からstartStation
地下鉄の駅までendStation
の平均時間を過ごしました。
現在の日付を含むすべての平均旅行時間の計算startStation
直接到达
endStation
ストローク。
通話getAverageTime
時間は、ルートが少なくとも旅行の旅程が含まれてい尋ねます。
あなたがgetAverageTimeを呼び出すと、ルートが少なくとも旅行の旅程が含まれてい尋ねます。
あなたはすべてのためにと仮定してよいcheckIn
とcheckOut
の通話論理的です。つまり、顧客場合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
試合後、慎重に考えるとによって、そのを見つけたmap
とpair
、一緒に使用することができます。次のようにアイデアは以下のとおりです。
- 地図では
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日