華為od面試算法題


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;

}

結果好像不一樣,我是用的他淘汰的方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM