这是一个面试问题,我想知道是否有更好的方法来解决这个问题。 我有一长串数据说,[(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作为返回类型。现在我完全记住了这个问题,我确实必须返回一对。但不一定必须是同一个对象。我相应地更新了方法的返回类型。
答案 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)]