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;
}
结果好像不一样,我是用的他淘汰的方法
来源:https://www.cnblogs.com/suxia/p/12015334.html