题目
使每个元素只出现一次,并返回新的数组。
您必须通过在 O(1)额外的内存中就地修改输入数组来实现这一点。
当然c++标准库已经提供了相应的算法。但是适当的轮子还是有必要造一下的(^__^)
C++具体实现代码如下:
//正常版本
vector<int> removeVector(vector<int> nums)
{
if (nums.size() == 0)
{
return{};
}
int i = 0;
auto iterBegin = nums.begin();
auto iterEnd = nums.begin();
for (int j = 1; j < nums.size(); ++j)
{
if (nums[i] != nums[j])
{
++i;
++iterEnd;
nums[i] = nums[j];
}
}
return vector<int>(iterBegin, ++iterEnd);
}
//开挂版本
vector<int> removeVector_(vector<int> nums)
{
auto iterBegin = nums.begin();
auto iterEnd = std::unique(nums.begin(), nums.end());
return std::move(vector<int>(iterBegin, iterEnd));
}
vector<int> v = removeVector({ 1,4,6,8 });
for (auto value : v)
{
cout << value << " ";
}
cout << endl;
vector<int> vv = removeVector_({ 1,1,3,4,6,8,8 });
for (auto value : vv)
{
cout << value << " ";
}
cout << endl;
打印如下:
其实我们可以看一下unique的源码,发现会和正常版本是一样的(但是写的十分精炼):
template<class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last)
{
if (first == last)
return last;
ForwardIt result = first;
while (++first != last) {
if (!(*result == *first) && ++result != first) {
*result = std::move(*first);
}
}
return ++result;
}
最后给出一个py的版本,可以看出py的切片还是很神奇的!
def remove(list):
i = 0
for index,val in enumerate(list):
if list[i] != list[index]:
i += 1
list[i] = list[index]
return list[:i+1]
print(remove([1,1,2,2,2,3,4]))