维持元组的插入顺序并计算k(3)个唯一路径/乘积

时间:2019-10-04 06:32:10

标签: python list tuples

在准备面试时,我看到以下问题:

给出以下元组作为输入,其中第一个元素是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)

上述解决方案的答案符合预期。有没有更简单的解决方案,还是可以使用其他数据结构来解决?谢谢!

2 个答案:

答案 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