面试公司:MS(广州)
本帖最后由 STQ 于 2019-8-10 19:53 编辑
# 给一个列表,列表中每个元素都是一个2元tuple,每个tuple表明了一个会议室的约定时间;
# 写一个算法,可以用最少的会议室,尽量不冲突地安排会议室。
def Q(meet_time):
'''
meet_time是一个n*2的列表,它的每个元素都是由两个数字组成;
其中前面的数字为会议开始时间,后面的数字为会议结束时间。
则最终输出的应该是一个列表a:
len(a)就是需要的最少的会议室,而a里面的每个元素代表了每个会议室的安排。
'''
a = []
for i in meet_time:
# 对所有订单时间做for循环
p0 = 0
# p0是个标记,该标记初始状态为0;
# 为1的时候说明这个i第x个会议室的安排有冲突;为2的时候说明已经安排进某一个会议室。此时再所有的循环应被跳过,跳到下一个i开始。
if a == []:
a.append()
# 当a为空的时候,说明目前会议室没有人订,直接安排到第一个list中
else:
for x in a:
# 对a中的集合进行for循环,对于i中的某一个订单,需要对a中所有集合做对比
if p0 == 2:
# p0=2,意味着这个订单i已经放入某一个会议室内,所以下面的搜寻无意义,直接跳过
continue
p0 = 0
# 如果p0!=2,每次在新的x中,都将p0重置为0
for y in x:
for p in range(i,i):
if p in range(y,y):
p0 = 1
# 如果存在p在y中,即出现冲突,给p0赋值为1,直接断开这个循环,在后面通过p0判定跳过循环。
break
if p0 == 1:
break
if p0 == 1:
# p0 = 1 说明出现重复,需要跳过这一个x,在下一个x中寻找,所以后面用continue跳过本循环
continue
else:
# 如果p0!=1,即对于所有y在x内,i与其不存在冲突,i可以安插进x内。将p0赋值为2,标记着已安排,跳过本循环。
p0 = 2
x.append(i)
continue
if p0 == 1:
# 在循环的最后,如果在最后一个会议室中为1,说明与目前所有的会议室有冲突,则给这个i新开一个会议室
a.append()
for u in a:
u.sort()
#将a中的元素排序,使其按照时间顺序排列
return a
# 例题:
print Q([(8,12),(16,19),(10,16),(9,14),(13,16),(15,19),(8,10),(17,19),(19,23),(19,23)])
# 结果:
# [[(8, 12), (13, 16), (16, 19), (19, 23)], [(8, 10), (10, 16), (17, 19), (19, 23)], [(9, 14), (15, 19)]]
select country,count(country) as visitor from log
group by country
order by visitor desc;
select country,count(country) as visitor from (select distinct(ip),country from log) as a
group by country
order by visitor desc;
页:
[1]