华为软件工程师面试算法题

Jeffrey Shao(同事的面试题)

他的网页链接:https://www.mockingbird.fun/2019/12/09/%E5%8D%8E%E4%B8%BAod%E9%9D%A2%E8%AF%95%E7%AE%97%E6%B3%95%E9%A2%98/

以下均来自回忆,仅供参考。

机试题:

题目:

统计参加聚会,每个小时的人数,聚会从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;

}

结果好像不一样,我是用的他淘汰的方法

posted @ 2019-12-10 10:53  Suarezz  阅读(7986)  评论(3编辑  收藏  举报