题目来源:LintCode
原题地址:http://www.lintcode.com/zh-cn/problem/remove-element/
题目:
给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度。
元素的顺序可以改变,并且对新的数组不会有影响。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出一个数组 [0,4,4,0,0,2,4,4],和值 4
返回 4 并且4个元素的新数组为[0,0,0,2]
难度级别:
容易
容易
思路分析:
此题其实采用c++自带的迭代器模式来写就会变得很容易;
需要知道的是,vector中的erase函数要么删除指定位置loc的元素,要么删除区间[start, end)的所有元素.返回值是指向删除的最后一个元素的下一位置的迭代器。
因此,我们只需要遍历vector数组,当元素相等时,删除该元素,并利用返回值继续下一个元素的遍历就可以了。
此题其实采用c++自带的迭代器模式来写就会变得很容易;
需要知道的是,vector中的erase函数要么删除指定位置loc的元素,要么删除区间[start, end)的所有元素.返回值是指向删除的最后一个元素的下一位置的迭代器。
因此,我们只需要遍历vector数组,当元素相等时,删除该元素,并利用返回值继续下一个元素的遍历就可以了。
实现代码:
class Solution
{
public:
/**
*@param A: A list of integers
*@param elem: An integer
*@return: The new length after remove
*/
int removeElement(vector<int> &A, int elem)
{
vector<int>::iterator it = A.begin();
for (; it != A.end();)
{
if (*it == elem)
{
it = A.erase(it);
} else
{
it++;
}
}
return A.size();
}
};
代码说明:
需要注意的是,由于删除之后返回的是下一个元素的迭代器,这里删除元素和指针自动加1是要分开成两种情况的。是互斥的情形。
需要注意的是,由于删除之后返回的是下一个元素的迭代器,这里删除元素和指针自动加1是要分开成两种情况的。是互斥的情形。