擅长:python、mysql、java
<p>这个答案使用递归和<code>dict</code>进行快速计数器查找-</p>
<pre><code>def find_it(a = [], i = 0, d = {}):
if i >= len(a):
return [ n for (n, count) in d.items() if count % 2 == 1 ]
else:
d = d.copy()
d[a[i]] = d.get(a[i], 0) + 1
return find_it(a, i + 1, d)
</code></pre>
<p>它是这样工作的-</p>
<pre><code>print(find_it([ 1, 2, 2, 2, 3, 3, 4, 5, 5, 5, 5 ]))
# [ 1, 2, 4 ]
print(find_it([ 1, 2, 3 ]))
# [ 1, 2, 3 ]
print(find_it([ 1, 1, 2, 2, 3, 3 ]))
# []
print(find_it([]))
# []
</code></pre>
<hr/>
<p>上面的<code>i</code>和<code>d</code>在调用站点公开。另外,因为我们依赖于Python的默认参数,所以我们必须调用<code>d.copy()</code>,以避免发生<code>d</code>突变。使用内部<code>loop</code>可以缓解这两个问题-</p>
<pre><code>def find_it(a = []):
def loop(i, d):
if i >= len(a):
return [ n for (n, count) in d.items() if count % 2 == 1 ]
else:
<del>d = d.copy()</del>
d[a[i]] = d.get(a[i], 0) + 1
return loop(i + 1, d)
return loop(0, {})</code></pre>
<p>工作原理同上。你知道吗</p>