擅长:python、mysql、java
<p>解决这个问题的一般方法是使用<a href="http://en.wikipedia.org/wiki/Binary_search_algorithm" rel="nofollow">binary search</a>;您可以使用<a href="https://docs.python.org/2/library/bisect.html" rel="nofollow">^{<cd1>} module</a>实现一个:</p>
<pre><code>import bisect
def caught_speeding(speed):
tickets = [60, 80]
return bisect.bisect_left(tickets, speed)
</code></pre>
<p><code>bisect_left</code>函数以最有效的方式为您的速度找到<em>插入点</em>(它将查看每个列表的<em>一半</em>,以查看您的速度应该适合的位置,然后再找到一半,直到找到插入点为止)。对于速度高达60的情况,将其插入位置0,对于速度介于61和80之间的情况,将其插入位置1,其余的将添加到末尾的位置2:</p>
<pre><code>>>> import bisect
>>> tickets = [60, 80]
>>> bisect.bisect_left(tickets, 60)
0
>>> bisect.bisect_left(tickets, 61)
1
>>> bisect.bisect_left(tickets, 80)
1
>>> bisect.bisect_left(tickets, 81)
2
</code></pre>
<p>对于3种不同的票面价值,这确实让人感觉有些过分。稍后回到代码时,您的3分支<code>if-elif-else</code>构造更容易理解。你知道吗</p>