我在接受采访时提出了这个问题,从未真正提出过一个很好的解决方案。有人有“最佳”解决方案吗?目标是效率并且能够处理大量投入。
提供的材料:
我获得了一长串商店及其开放/关闭时间(比如1000)。
问题:
在一天中的特定时间,返回有多少商店开放
示例数据:
Sainsburys 10:00 23:00
Asda 02:00 18:00
Walmart 17:00 22:00
示例输入/输出
Input | Output
12:00 | 2
22:00 | 1 (walmart shut @ 22:00)
17:30 | 3
问题的两个部分是如何存储数据以及如何有效地得到答案,我猜你是如何阅读输入等并不重要。
感谢您的时间和见解!
答案 0 :(得分:2)
让我们采取刺:
//First, we turn the time input into an int and then compare it to the open and
//closing time ints to determine if the shop is open. We'l use 10:00 in this example.
//get magic time int
int magicTimeInt = CInt("10:00".Replace(":",""));
int openstorecount = 0;
foreach(var shoptime in ShopTimesList)//SHopTImesList is the list of shop names and times
{
string[] theShop = shoptime.Split(" ");
if( CInt(theshop[1].ToString().Replace(":", "")) < magicTimeInt
&&
CInt(theshop[2].ToString().Replace(":", "")) > magicTimeInt)
{
openstorecount++;
}
}
Console.WriteLine("10:00 | " + openstorecount.ToString());
答案 1 :(得分:0)
我会使用数据库:
TABLE shops (
name VARCHAR,
open TIME,
close TIME
)
SELECT count(*) AS number_of_shops FROM shops WHERE [input_time] BETWEEN open AND close
为了防止查询计算沃尔玛(在您的示例中),您可以添加一秒来打开并从关闭中减去一秒(或几分钟让任何人有机会购买东西)。
答案 2 :(得分:0)
我会做Java:
class Shop {
String name;
Time opening, closing;
Shop(String name; Time opening, Time closing){
this.name = name;
this.opening = opening;
this.closing = closing;
}
public boolean isOpen(Time time){
return opening.before(time) && closing.after(time)
}
}
添加代码以修剪时间值中的日期信息,只需创建所有商店的集合,迭代并查看每个商店的计数。