擅长:python、mysql、java
<p>你不想要组合。的确,你想要“aa”。但对于组合,因为你永远不会选择两次相同的项目,这是不会发生的。在</p>
<p>所以这里有一个“累积积”的正确版本,实际上,就像雷蒙德对组合所做的那样,我必须数数(90,90+90**2,90+90**2+90**3,…)来找出与我所跟踪的组合对应的好的幂。在</p>
<p>请注意,它并没有优化,因为我在分割产品。。。只值一个!在</p>
<pre><code>import itertools
alphaNumList = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&-()@=+;/!%$\\'\",.<>*^{}#~_[]")
cumulative = [len(alphaNumList)]
for i in range(1, 10):
cumulative.append(len(alphaNumList) ** (i+1) + cumulative[i - 1])
def getCombiFromIndex(combiNumber):
p = 0
while cumulative[p] < combiNumber:
p += 1 # WARNING : not robust to combi greater than (10,90) in my case :)
rest = combiNumber - 1 - (cumulative[p - 1] if p > 0 else 0)
return "".join([item for item in itertools.islice(itertools.product(alphaNumList, repeat=p + 1), rest, rest + 1)][0])
print(getCombiFromIndex(1)) # "a"
print(getCombiFromIndex(90)) # "]"
print(getCombiFromIndex(91)) # "aa"
print(getCombiFromIndex(800064)) # "ah+1"
</code></pre>
<p><strong><em>更新:</em></strong>我添加了一个方法来检索两个索引之间的列表,基于相同的概念,但在本例中,最好使用slice:)</p>
^{pr2}$