当我想尝试Python版本的以下问题时,我遇到了这个问题: https://leetcode.com/problems/first-missing-positive/discuss/17071/My-short-c++-solution-O(1)-space-and-O(n)-time
我不确定为什么 a[0], a[a[0]] = a[a[0]], a[0]
这行代码没有做交换?
>>> nums
[2, 1, 0]
>>> a = [2,1,0]
>>> a[0], a[a[0]] = a[a[0]], a[0]
>>> a
[2, 1, 0]
>>> a[0]
2
>>> a[0],a[2] = a[2], a[0]
>>> a
[0, 1, 2]
我的猜测是,a,b = b,a语法的实现大概是这样的:
tmp = a[0] (tmp = 2)
a[0] = a[a[0]] (a[0] = a[2] = 0)
a[a[0]] = tmp (a[a[0]] = a[0] = tmp = 2)
然后我查看了C++中swap函数的实现。我对C++一无所知,但是看起来思路是一样的: http://www.cplusplus.com/reference/algorithm/swap/
The behavior of these function templates is equivalent to:
template <class T> void swap (T& a, T& b)
{
T c(std::move(a)); a=std::move(b); b=std::move(c);
}
template <class T, size_t N> void swap (T (&a)[N], T (&b)[N])
{
for (size_t i = 0; i<N; ++i) swap (a[i],b[i]);
}
我们有 c = a,然后 a = b,b = a。那么为什么 C++ 的 swap 函数没有这个问题呢?如何用 Pythonic 的方式编写这种 swap 函数?
a = [1,2,3,4]
),您会发现它确实更改了值,但问题在于执行顺序,因此a[a[0]]
在两次调用时指向不同的元素。 - Zinkia = [2,3,4]
,你会得到“列表分配索引超出范围”的错误。 - molbdniloa[0]
。 - molbdnilo