如何明智地实施96个条件? 我试图编写一个C++程序,它生成一个报告,它提供了一个关于时间使用的报告。把时间分成一刻钟一段 00:00-00:14, 00:15-00:29, …, 23:45-23:59.
我应该提供每次休息的事件数。这是到目前为止我的代码。如果有人能提出解决方案,我将不胜感激如何明智地实施96个条件? 我试图编写一个C++程序,它生成一个报告,它提供了一个关于时间使用的报告。把时间分成一刻钟一段 00:00-00:14, 00:15-00:29, …, 23:45-23:59.,c++,algorithm,time,C++,Algorithm,Time,我应该提供每次休息的事件数。这是到目前为止我的代码。如果有人能提出解决方案,我将不胜感激 string time = word; size_t found2 = word.find(":"); string tmpH,tmpM; tmpH = word.substr(0,found2); tmpM = word.substr((found2+1),word.length()); cout<<" word= "<<word<<" tmpH= "<&l
string time = word;
size_t found2 = word.find(":");
string tmpH,tmpM;
tmpH = word.substr(0,found2);
tmpM = word.substr((found2+1),word.length());
cout<<" word= "<<word<<" tmpH= "<<tmpH<<" tmpM= "<<tmpM<<endl;
int h = atoi(tmpH.c_str());
int m = atoi(tmpM.c_str());
输出:
00:00-00:14 10 users logged in
00:15-00:29 15 users logged in
....
23:45-23:59 3 users logged in
因此,我在一小时内有4个条件,即96个时间条件?首先,您可以将每段小时和分钟转换为分钟,例如23:45等于1095分钟。将所有这些块存储到列表中,并按开始时间对它们进行排序 对于每个事件,将每个事件时间转换为分钟数,并使用二进制搜索(或线性搜索)搜索最大开始时间小于或等于事件时间的块,该块将是此事件所属的块 排序的时间复杂度为O(1),因为只有很少的块,对于所有查询,时间复杂度为O(n),其中n是查询数。(在这种情况下,可以认为二进制搜索需要恒定的时间)
编辑:由于您添加了另一个约束,因此,您需要按日期和时间对所有事件进行排序,对于每个日期,您可以使用所描述的方法。首先,您可以将每段小时和分钟转换为分钟,例如23:45等于1095分钟。将所有这些块存储到列表中,并按开始时间对它们进行排序 对于每个事件,将每个事件时间转换为分钟数,并使用二进制搜索(或线性搜索)搜索最大开始时间小于或等于事件时间的块,该块将是此事件所属的块 排序的时间复杂度为O(1),因为只有很少的块,对于所有查询,时间复杂度为O(n),其中n是查询数。(在这种情况下,可以认为二进制搜索需要恒定的时间) 编辑:由于您添加了另一个约束,因此,您需要按日期和时间对所有事件进行排序,对于每个日期,您可以使用所描述的方法。给定行,如:
bkg988 sshd Fri Mar 28 02:17 - 02:17 (00:00) 139.218.157.100
您可以这样做:
std::string to_month_number(const std::string& name)
{
return name == "Jan" ? "01/" :
name == "Feb" ? "02/" :
...;
}
typedef std::pair<std::string, int> When;
typedef std::map<When, int> Num_Logins;
Num_Logins num_logins;
std::string user, term, day, month, dom;
int hour, min;
char c;
while (std::cin >> user >> term >> dow >> month >> dom >> hour >> c >> min && c == ':')
{
if (dom.length() == 1) dom = ' ' + dom; // standardise with for sorting...
When when = std::make_pair(to_month_number(month) + ' ' + dom, (hour * 60 + min) / 15);
++num_logins[when];
}
给定行,如:
bkg988 sshd Fri Mar 28 02:17 - 02:17 (00:00) 139.218.157.100
您可以这样做:
std::string to_month_number(const std::string& name)
{
return name == "Jan" ? "01/" :
name == "Feb" ? "02/" :
...;
}
typedef std::pair<std::string, int> When;
typedef std::map<When, int> Num_Logins;
Num_Logins num_logins;
std::string user, term, day, month, dom;
int hour, min;
char c;
while (std::cin >> user >> term >> dow >> month >> dom >> hour >> c >> min && c == ':')
{
if (dom.length() == 1) dom = ' ' + dom; // standardise with for sorting...
When when = std::make_pair(to_month_number(month) + ' ' + dom, (hour * 60 + min) / 15);
++num_logins[when];
}
你能举一个例子说明你的输入和你想要的输出吗?你到底有什么问题?你尝试了什么?你展示的代码与你的任务没有多大关系,不是吗?你试过什么?在几个小时内和每个季度进行一次循环非常简单。我添加了一个示例。loop的问题在于它不仅仅是一天。输入为用户登录年数,初始时间不是00:00。它可以是任何时候…你能举一个例子说明你的输入和你想要的输出吗?你到底有什么问题?你尝试了什么?你展示的代码与你的分配没有什么关系,不是吗?你试过什么?在几个小时内和每个季度进行一次循环非常简单。我添加了一个示例。loop的问题在于它不仅仅是一天。输入为用户登录年数,初始时间不是00:00。随时都可以……谢谢。这似乎是最好的办法,而不是转换成时间,并用96个变量检查时间框架。@Bernard,实际上,在这种情况下,你不需要二进制搜索,只要线性搜索就足够了:DThanks。这似乎是最好的办法,而不是转换为时间,并用96个变量检查时间框架。@Bernard,实际上,在这种情况下,你不需要二进制搜索,只要线性搜索就足够了:D