题目要求
版本一:泛型算法find
整体思路
使用sort对序列进行排序
使用find得到指定值的迭代器
将迭代器转换为unsigned型index(删除容器元素会导致原有迭代器失效)
根据index进行相应的删除操作
返回删除后的序列长度
代码
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
std::sort(nums.begin(), nums.end());
auto i = std::find(nums.begin(), nums.end(), val);
//没有指定元素
if (i == nums.end())
{
return nums.size();
}
//存在指定元素,将迭代器转换为整型index执行删除操作
else
{
unsigned index = static_cast<unsigned>(i - nums.begin());
while (index < nums.size() && nums[index] == val)
{
nums.erase(nums.begin() + index);
}
}
return nums.size();
}
};
版本二:遍历删除
整体思路
遍历数组,遍历的同时进行比对,如果值相同则删除
代码
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
for (size_t i = 0; i < nums.size(); ++i)
{
if (nums[i] == val)
{
nums.erase(nums.begin() + i);
--i;
}
}
return nums.size();
}
};
学到了什么
1、最高效的解法往往只需要最朴素的思路…
2、熟悉了泛型算法find的用法
3、注意边界值判断
while (index < nums.size() && nums[index] == val)
{
nums.erase(nums.begin() + index);
}