华为软件工程师面试算法题
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; }
结果好像不一样,我是用的他淘汰的方法