擅长:python、mysql、java
<p>您正在为尚未有值的列表的索引赋值:</p>
<pre><code> sln =[]
# ...
sln[i] = max(sln[i],sln[j]+1 )
</code></pre>
<p>您可以在找到新的匹配项时附加到解决方案</p>
<p>不过,这里有一个更简单的解决方案:</p>
<pre><code>def solve(a):
if not a:
return []
sln = [a[0]]
for x in a[1:]:
if x % 2 != sln[-1] % 2:
sln.append(x)
return sln
example = [1, 2, 2, 5, 6]
print(solve(example))
</code></pre>
<p>第一位确保传递空列表时没有错误。解决方案始终包含第一个元素。如果mod 2的值与解决方案中到目前为止的最后一个元素不同,则将包括所有其他元素</p>
<p>基于同样的想法,一个更简单的解决方案(事实上是一行代码)是这样的,但它有点难读,所以如果简洁本身就是一个目标,那就更好了:</p>
<pre><code>def solve_short(a):
return [x for n, x in enumerate(a) if not n or x % 2 != a[n-1] % 2]
</code></pre>
<p>我没有测量时间,但我希望<code>solve_short()</code>的运行速度也比<code>solve()</code>快——如果考虑到这一点的话</p>
<p>请注意,简短的解决方案利用了这样一个事实,即在原始列表中包含任何与其前一个不具有相同奇偶校验的数字,就可以获得正确的解决方案,即使这没有较长解决方案中的逻辑那么明确</p>
<p>我很好奇,运行了一个测试-长的解决方案实际上比短的解决方案性能更好,但这里有一个在大多数情况下性能更好:</p>
<pre><code>def solve_fast(a):
return [] if not a else [a[0]] + [x for x, y in zip(a[1:], a) if x % 2 != y % 2]
</code></pre>