擅长:python、mysql、java
<p>下面是一个在<code>O(log(input/len(l)))</code>中运行的解决方案,它不进行任何实际计算(没有列表操作):</p>
<pre><code>l = ['Sheldon','Leonard','Penny','Rajesh','Howard']
n = int(input()) # taking input from user to print the name of the person
# standing at that position
i = 0
while n>(len(l)*2**i):
n = n - len(l)* (2**i)
i = i + 1
index = int((n-1)/(2**i ))
print(l[index])
</code></pre>
<p>说明:每次向后推整个列表时,列表长度将精确地增长<code>len(l) x 2^i</code>。但你得先弄清楚这种情况发生了多少次。这就是while正在做的事情(这就是<code>n = n - len(l)* (2**i)</code>正在做的事情)。while在意识到将发生<code>i</code>次追加双列表时停止。最后,在您计算出<code>i</code>之后,您必须计算索引。但是在出现的第<code>i</code>个列表中,每个元素都被复制<code>2^i</code>次,因此您必须按<code>2**i</code>对数字进行划分。一个小细节是索引必须减去<code>1</code>,因为Python中的列表是0索引的,而输入是1索引的。你知道吗</p>