擅长:python、mysql、java
<p>基本问题是,即使已经将元素添加到字典中,也要增加<code>n</code>。因此,如果您已经添加了元素,它仍然将<em>计算为一个元素。如果它是<em>而不是</em>添加的,则算作两个,但是在可能的情况下</p>
<p>无论如何,没有理由这样做,我们可以先通过洗牌字符来创建一个随机字符串,然后将这些字符“缝合”在一起,如:</p>
<p>基本问题是,即使已经将元素添加到字典中,也要增加<code>n</code>。因此,如果您已经添加了元素,它仍然将<em>计算为一个元素。如果它是<em>而不是</em>添加的,则算作两个,但是在可能的情况下</p>
<p>无论如何,没有理由这样做,我们可以先通过洗牌字符来创建一个随机字符串,然后将这些字符“缝合”在一起,如:</p>
<pre><code>from string import ascii_uppercase
from random import shuffle
dt = list(ascii_uppercase)
shuffle(dt)
dt = iter(dt)
result = {k: v for a, b in zip(dt, dt) for k, v in ((a,b), (b, a))}
</code></pre>
<p>或者,如果一个字符可以与其自身“配对”,我们可以像这样实现它:</p>
<pre><code>from string import ascii_uppercase
from random import shuffle, randint
dt = list(ascii_uppercase)
shuffle(dt)
result = {}
i = 0
while i < len(dt):
d = randint(0,len(dt)-i-1 > 0)
k = dt[i]
v = dt[i+d]
result.update({k: v, v: k})
i += 1 + d
assert len(result) == len(ascii_uppercase)
assert len(set(result.values())) == len(ascii_uppercase)
</code></pre>
<p>这两种算法都是在线性时间内工作的,因为它们只对随机字符列表进行一次遍历,每次都将前一个字符与下一个字符(或当前字符与自身)链接起来。你知道吗</p>