描述
给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度。
元素的顺序可以改变,并且对新的数组不会有影响。
您在真实的面试中是否遇到过这个题? 是
样例
给出一个数组 [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(); } };