Jeffrey Shao(同事的面試題)
以下均來自回憶,僅供參考。
機試題:
題目:
統計參加聚會,每個小時的人數,聚會從12點至20點。
輸入:
每行包括兩個整數,第一整數是參加聚會的時間,第二個整數是離開聚會的時間,例如 12,15,不包含15,意味着[12,15),以-1,-1結束輸入
輸出:
例如:[12,13):3
測試用例:
輸入:
12,16 13,15 18,20 12,20 -1,-1
輸出:
[12,13):2 [13,14):3 [14,15):3 [15,16):3 [16,17):2 [17,18):2 [18,19):2 [19,20):2
我一開始的思路是用一個數據結構來保存每個人進出的時間,遍歷每個人的進出時間,發現這個而操作太繁瑣。
轉念一想,對每個人進出的時間琢磨了一下,不如用一個數組記錄每個小時的人數,例如輸入12,16
#include<iostream> #include<stdio.h> using namespace std; int main() { int a, b; int record[30] = { 0 }; while (scanf("%d,%d",&a,&b)) { if (a == -1 || b == -1) return; for (int i = a; i < b; i++) { record[i]++; } } printf("[12,13):%d", record[12]); printf("[13,14):%d", record[13]); printf("[14,15):%d", record[14]); printf("[15,16):%d", record[15]); printf("[16,17):%d", record[16]); printf("[17,18):%d", record[17]); printf("[18,19):%d", record[18]); printf("[19,20):%d", record[19]); for (int i = 0; i < 30; i++) { record[i] = 0; } return 0; }
底下是我自己的代碼
#include<iostream> #include <vector> using namespace std; struct member { int start=0; int end=0; }; int cal_number(vector<member> memberlist, int start, int end) { int count = 0; for (int i = 0; i < memberlist.size(); i++) { if (memberlist[i].start <= start && memberlist[i].end >= end) count++; } return count; } int main() { member person; vector<member> memberlist; while (scanf("%d,%d", &person.start, &person.end)) { if (person.start == -1 && person.end == -1) break; memberlist.push_back(person); } int max_time = 0; int min_time = 24; for (int i = 0; i < memberlist.size(); i++) { if (memberlist[i].end > max_time) max_time = memberlist[i].end; if (memberlist[i].start < min_time) min_time = memberlist[i].start; } while (max_time != min_time) { printf("[%d,%d):%d\n", min_time, min_time + 1, cal_number(memberlist, min_time, min_time + 1)); min_time++; } return 1; }
結果好像不一樣,我是用的他淘汰的方法
