1. 题目
请你实现一个类 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 时,询问的路线至少包含一趟行程。
你可以假设所有对 checkIn 和 checkOut 的调用都是符合逻辑的。也就是说,如果一个顾客在 t1 时刻到达某个地铁站,那么他离开的时间 t2 一定满足 t2 > t1 。所有的事件都按时间顺序给出。
示例:
输入:
[“UndergroundSystem”,“checkIn”,“checkIn”,“checkIn”,“checkOut”,“checkOut”,“checkOut”,“getAverageTime”,“getAverageTime”,“checkIn”,“getAverageTime”,“checkOut”,“getAverageTime”]
[[],[45,“Leyton”,3],[32,“Paradise”,8],[27,“Leyton”,10],[45,“Waterloo”,15],[27,“Waterloo”,20],[32,“Cambridge”,22],[“Paradise”,“Cambridge”],[“Leyton”,“Waterloo”],[10,“Leyton”,24],[“Leyton”,“Waterloo”],[10,“Waterloo”,38],[“Leyton”,“Waterloo”]]
输出:
[null,null,null,null,null,null,null,14.0,11.0,null,11.0,null,12.0]
解释:
UndergroundSystem undergroundSystem = new UndergroundSystem();
undergroundSystem.checkIn(45, “Leyton”, 3);
undergroundSystem.checkIn(32, “Paradise”, 8);
undergroundSystem.checkIn(27, “Leyton”, 10);
undergroundSystem.checkOut(45, “Waterloo”, 15);
undergroundSystem.checkOut(27, “Waterloo”, 20);
undergroundSystem.checkOut(32, “Cambridge”, 22);
undergroundSystem.getAverageTime(“Paradise”, “Cambridge”); // 返回 14.0。从 “Paradise”(时刻 8)到 “Cambridge”(时刻 22)的行程只有一趟
undergroundSystem.getAverageTime(“Leyton”, “Waterloo”); // 返回 11.0。总共有 2 躺从 “Leyton” 到 “Waterloo” 的行程,编号为 id=45 的乘客出发于 time=3 到达于 time=15,编号为 id=27 的乘客于 time=10 出发于 time=20 到达。所以平均时间为 ( (15-3) + (20-10) ) / 2 = 11.0
undergroundSystem.checkIn(10, “Leyton”, 24);
undergroundSystem.getAverageTime(“Leyton”, “Waterloo”); // 返回 11.0
undergroundSystem.checkOut(10, “Waterloo”, 38);
undergroundSystem.getAverageTime(“Leyton”, “Waterloo”); // 返回 12.0
2. 解答
#define MAXSIZE 20000
typedef struct UndergroundSystem {
int id;
char inStation[11];
char outStation[11];
int checkInTime;
int checkOutTime;
} UndergroundSystem;
int g_num;
UndergroundSystem* undergroundSystemCreate() {
UndergroundSystem* obj = (UndergroundSystem*)malloc(sizeof(UndergroundSystem) * MAXSIZE);
memset(obj, 0, sizeof(UndergroundSystem) * MAXSIZE);
g_num = 0;
return obj;
}
void undergroundSystemCheckIn(UndergroundSystem* obj, int id, char * stationName, int t) {
obj[g_num].id = id;
strncpy(obj[g_num].inStation, stationName, strlen(stationName));
obj[g_num].checkInTime = t;
g_num++;
}
void undergroundSystemCheckOut(UndergroundSystem* obj, int id, char * stationName, int t) {
for (int i = 0; i < g_num; i++) {
if (obj[i].id == id) {
// 有出站记录跳过,即同一个用户可以有多条记录
if (obj[i].outStation[0] != '\0') {
continue;
}
strncpy(obj[i].outStation, stationName, strlen(stationName));
obj[i].checkOutTime = t;
break;
}
}
}
double undergroundSystemGetAverageTime(UndergroundSystem* obj, char * startStation, char * endStation) {
double sum = 0;
double cnt = 0;
for (int i = 0; i < g_num; i++) {
if (strcmp(obj[i].inStation, startStation) == 0 && strcmp(obj[i].outStation, endStation) == 0) {
sum += ((double)obj[i].checkOutTime - (double)obj[i].checkInTime);
cnt++;
}
}
if (cnt == 0) {
return 0;
}
return sum / cnt;
}
void undergroundSystemFree(UndergroundSystem* obj) {
free(obj);
obj = NULL;
}