描述
给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度。
元素的顺序可以改变,并且对新的数组不会有影响。
您在真实的面试中是否遇到过这个题? 是
样例
给出一个数组 [0,4,4,0,0,2,4,4],和值 4
给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度。
元素的顺序可以改变,并且对新的数组不会有影响。
您在真实的面试中是否遇到过这个题? 是
样例
给出一个数组 [0,4,4,0,0,2,4,4],和值 4
返回 4 并且4个元素的新数组为[0,0,0,2]
分析
这里除了返回数组的长度,还需要返回操作之和的数组。在该系统中,返回的数组与原始顺序是一致的。所以方法一不太好使。我们使用方法二,将不等于elem的元素保存到另外一个数组中,然后再把覆盖赋值。
程序
class Solution {
public:
/*
* @param A: A list of integers
* @param elem: An integer
* @return: The new length after remove
*/
//要求在原数组上操作,空间复杂度为O(1)
//方法一: 使用STL操作
/*
int removeElement(vector<int> &A, int elem) {
// write your code here
if(A.empty())
return 0;
sort(A.begin(), A.end());
A.erase(find(A.begin(), A.end(), elem), A.end());
//for(int i = 0; i < A.size(); i++)
// cout << A[i] << " ";
//cout << endl;
return A.size();
}
*/
//题库中的删除后的数组没有排序
int removeElement(vector<int> &A, int elem) {
vector<int> B;
if(A.empty())
return 0;
for(int i = 0; i < A.size(); i++){
if(A[i] != elem)
B.push_back(A[i]);
}
A.clear();
A.assign(B.begin(), B.end());
return A.size();
}
};