您的位置:首页 > 其它

2018大疆校招软件岗位笔试题目(求有效工作时间)——未在线验证

2017-08-31 16:43 986 查看


题目

在DJI的工时打卡计算系统中,一个工作日的定义是由工作当日当天的凌晨03:00:00开始,到隔天凌晨03:00:00(不包含)为止。

这其中,工作日当天的中午12:30:00到下午14:00:00(不包含)为午休时间,不计入工作时间。

Tom由于工作繁忙,担心自己有时候会忘记打卡,因此他每次经过打卡机到时候都会不由自主地打一次卡。为了更好的了解自己的工作情况,Tom找到了自己整个八月份的乱序打卡记录,但是这些数据不小心弄乱了,所以Tom想请你帮个忙。从给出的N条记录中,找出所有有效的打卡工作日(即在该工作日中打开次数>=2并且有效工作时间>0),并计算该工作日中的有效工作时间(按秒计算,除去打开时间内出现的午休时间)。其中工作日定义为当天3:00:00到次日2:59:59为当天工作日,即当天 2:59:59(包括)以前的打开记录当作前一天打开记录和有效工作时间,不计做当天的打开记录和有效工作时间。


输入

12

08.10 01:00:00

08.09 23:59:59

08.10 17:00:00

08.10 18:00:00

08.01 01:00:00

08.01 04:00:00

08.03 10:00:00

08.03 12:29:59

08.04 10:00:00

08.04 12:30:00

08.07 01:00:00

08.07 02:00:00


输出

08.03 8999

08.04 9000

08.06 3600

08.09 3601

08.10 3600

小白只针对给出算例在本地进行验证,无误,输入输出未验证!!
解题思路:字符串按格式读取,将时间均转化为秒数,对各种情况进行分析。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

#define REST_START 45000  //60*60*12+30*60
#define REST_END 50400   //60*60*14
#define START 10800    //60*60*3
#define END 86400  //60*60*24
#define REST 5400   //REST_END-REST_START

void main()
{
int N;//数据量
vector<int>  dayRecord[32];// 8月31天,vector从1~31对应日期
int workTime[32];// 记录每天的工作时间
cin >> N;
if (getchar() == '\n')
{
;
}
for (int i = 0; i < N; i++)
{
string str;
int day = 0, hour, minute, second, time;
getline(cin, str);
sscanf_s(str.c_str(), "08.%d %d:%d:%d", &day, &hour, &minute, &second);
time = hour * 60 * 60 + minute * 60 + second;
if (time > REST_START&&time < REST_END)    //如果是12:30:00~14:00:00
continue;
else if (time < START)      //如果处在00:00~02:59:59
{
dayRecord[day - 1].push_back(time + END - REST);
}
else if (time >= REST_END)  //如果在14:00:00之后
dayRecord[day].push_back(time - REST);
else
dayRecord[day].push_back(time);

}
for (int i = 1; i <= 31; i++)//计算每天工作时间
{
int min = END + START,
max = 0,
size = dayRecord[i].size();
if (size < 2)        //如果打卡次数小于2
{
continue;
}
for (int j = 0; j < size; j++)
{
if (dayRecord[i][j] < min)
min = dayRecord[i][j];
if (dayRecord[i][j]>max)
max = dayRecord[i][j];
}
workTime[i] = max - min;
if (i < 10)
printf("08:0%d %d\n", i, workTime[i]);
else
printf("08:%d %d\n", i, workTime[i]);
}
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: