访谈问:确定数据流中的唯一配对

时间:2018-01-29 19:47:01

标签: algorithm data-structures

这是一个面试问题,我想知道是否有更好的方法来解决这个问题。 我有一长串数据说,[(A,1),(B,2),(A,2),(B,1),(A,3),(A,4),(B,4) ),....]等等。 这里,(A,1)与(B,1)配对。 (A,2)与(B,2)对配对。 在流(长度未知)中,将有一个项目没有一对,如上例中的(A,3)。保证只有1个没有一对。如何确定哪一项是哪一项?

我的方法是有2个地图 - 1个用于A,1个用于B用整数键。根据流中的A或B,我会检查其他地图中是否存在特定的密钥,如果条目存在,我会删除该条目,否则我会将该对添加到它所属的相应地图中。最后,我检查了两张地图,看看哪一张都有左对。

我觉得可能有更好的方法。请告诉我。

class Pair {
    Integer value;
    String collectionName;
}

class Stream {
    public Pair getNext();
    public boolean hasNext();
}

public Pair findUniquePair(Stream s) {
    ....
}

我必须实施

  

findUniquePair()方法

更新:抱歉,我之前将boolean作为返回类型。现在我完全记住了这个问题,我确实必须返回一对。但不一定必须是同一个对象。我相应地更新了方法的返回类型。

2 个答案:

答案 0 :(得分:5)

这仅适用于"只有一个非配对项目"保证:将int结果初始化为零,然后逐项遍历流。对于每个项XOR,结果为值。到达流的末尾时,结果将设置为唯一项。您可以忽略集合名称,没有必要:

Stream s = ...
while (s.hasNext()) {
    Pair p = s.getNext();
    res ^= p.getValue();
}

这个技巧起作用的原因是将int两次异或同一值使该值保持不变。您应用XOR的顺序无关紧要,因为所有配对的XOR最终会相互抵消。

  

我现在记得我必须为该方法返回一对。它可以是一个新的Pair对象,也不一定是同一个对象。

要确定要为名称"A""B"返回的内容,请创建一个简单的计数器。当您看到"A"时,请为其添加1;当你看到"B"时,减去1.继续对值进行相同的XOR。

一旦到达流的末尾,计数器将为正数或负数(但不为零)。如果是积极的,我们会有一个未配对的"A";否则我们有一个未配对的"B"

答案 1 :(得分:0)

尝试这种方法:

逻辑是:

使用表示char的Unicode代码并按原样添加一个和第二个项目,并检查元组是否存在(如果存在),然后将其保留在轨道列表中,最后只用轨道检查原始列表。

在python中:

data=[('A', 1), ('B', 2), ('A', 2), ('B', 1), ('A', 3), ('A', 4), ('B', 4)]



track=[]

for i in data:
    if (chr(ord(i[0])+1),i[1]) in data:
        if (chr(ord(i[0]) + 1), i[1]) not in track:
            track.extend([i,(chr(ord(i[0])+1),i[1])])

print(list(filter(lambda x:x not in track,data)))

输出:

[('A', 3)]
相关问题