今天写代码遇到了一个以前没有注意到的事情
class Solution { // O(n^2), average O(n)
public:
...
...
static inline void swap(vector<int>& nums, int l, int r) {
if (l == r) return ;
// cout << "size " << nums.size() << " l " << l << " r " << r << endl;
// cout << "before " << nums[l] << " " << nums[r] << endl;
nums[l] ^= nums[r];
nums[r] ^= nums[l];
nums[l] ^= nums[r];
// cout << "after " << nums[l] << " " << nums[r] << endl;
}
};
写代码时,我经常用位操作代替常规操作,比如乘 2 除 2,判断奇偶,交换两个数等,因为位操作速度快一些,今天写一个交换函数时,没有注意到传入的两个下标可能存在相等情况,没有加入if (l == r) return ;
这个判断条件,导致交换函数将传入的数变成 0 了。
附上C++11 <utility>
头文件中swap()
函数的可能实现。
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]);
}