在准备面试时,我看到以下问题:
给出以下元组作为输入,其中第一个元素是CustomerID,第二个元素是ProductID。我们需要找到每个客户购买的ProductID订单序列中连续最长的输出。
Input: [('A','Milk'), ('B','Milk'), ('A','Apples'), ('A','Coffee'),
('B','Apples'),('C','Apples'), ('B','Coffee'), ('A','Vegetable'), ('B', 'Hat')]
Output: Milk, Apples, Coffee (Max order 3)
# Maintain the order of the tuple
我的尝试如下:
Input= [('A','Milk'), ('B','Milk'), ('A','Apples'), ('A','Coffee'),
('B','Apples'),('C','Apples'), ('B','Coffee'), ('A','Vegetable'), ('B', 'Hat')]
result=[]
for a, b in Input:
if b not in result and len(result)<3:
result.append(b)
print ', '.join(result)
上述解决方案的答案符合预期。有没有更简单的解决方案,还是可以使用其他数据结构来解决?谢谢!
答案 0 :(得分:1)
让我们更深入地研究您的方法并计算其时间复杂度:
result=[]
for a, b in Input:
if b not in result and len(result)<3:
result.append(b)
您一次扫描输入,它是O(N)
。之后,您检查数组result
来检查是否之前找到过b
,它也是O(N)
,但是在这种情况下b
的长度很小。因此我们可以假设它是一个常量c
。
最终订单为:
扫描输入*扫描
b
= O(N)* c≈O(N)
因为在最坏的情况下c=2
!
这真的很理想,因此您无需考虑假定的条件就使用数据结构。
答案 1 :(得分:1)
使用Python 3.7+,您可以使用以下顺序对字典进行排序:
d = {b:a for a,b in Input}
result = list(d)[:3]
print(', '.join(result))
# Milk, Apples, Coffee