Given an array nums and a value val, remove all instances of that value in-place and return the new length.
Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
The order of elements can be changed. It doesn't matter what you leave beyond the new length.
**Example1: **
Given nums = [3,2,2,3], val = 3,
Your function should return length = 2, with the first two elements of nums being 2.
It doesn't matter what you leave beyond the returned length.
**Example2: **
Given nums = [0,1,2,2,3,0,4,2], val = 2,
Your function should return length = 5, with the first five elements of nums containing 0, 1, 3, 0, and 4.
Note that the order of those five elements can be arbitrary.
It doesn't matter what values are set beyond the returned length.python
题目要求不使用额外的空间,移除全部数值等于val的元素,返回新数组的长度,因而想到使用替换的方法。
将数组中数值等于val的元素与数组最后一个元素互换,再将最后一个元素删除。这样就完成了一个删除数值等于val元素的操做。数组
//声明一个int类型的向量vec vector<int> vec; //声明一个int类型,初始大小为10的向量vec vector<int> vec(10); //声明一个int类型,初始大小为10,且元素都为0的向量vec vector<int> vec(10, 0); //声明一个int类型的向量vec,并用向量vec1初始化vec vector<int> vec(vec1); // 利用数组arr的前五个元素初始化向量vec int arr[5] = {0, 1, 2, 3, 4}; vector<int> vec(arr, arr + 5);
//下标访问,不会进行越界检查 vec[0] //at访问,会检查越界,若是出界会抛出out of range 异常 vec.at(0) //访问第一个元素 vec.front() //访问最后一个元素 vec.back()
//在int类型的向量vec的末尾添加一个int元素1 vec.push_back(1); //删除vec的最后一个元素 vec.pop_back(); //在vec的pos位置插入元素element vec.insert(pos, element); //将向量vec中pos1位置与pos2位置的元素互换(swap能够用来释放内存) vec.swap(pos1, pos2); //删除向量vec中pos位置的元素 vec.erase(pos); //删除向量vec中pos1位置到pos2位置的元素 vec.erase(pos1, pos2); //清空向量vec vec.clear();
在容器vector中,其内存占用的空间是只增不减的,好比说首先分配了10,000个字节,而后erase掉后面9,999个,则虽然有效元素只有一个,可是内存占用仍为10,000个。全部内存空间在vector析构时回收。通常,咱们都会经过vector中成员函数clear进行一些清除操做,但它清除的是全部的元素,使vector的大小减小至0,却不能减少vector占用的内存。函数
//向量vec的大小,它告诉你容器里有多少元素。 vec.size() //向量vec的分配容量,能够大于size。它告诉你容器在已经分配的内存中总共能够容纳多少元素。 vec.capacity() //释放int类型的向量vec的内存 vector<int>().swap(vec); //下降vec的容量,使其与size匹配(可用于删除元素后,节省向量的空间) vec.shrink_to_fit() //为容器预留空间,但在空间内不真正建立元素对象,因此在没有添加新的对象以前,不能引用容器内的元素。 //使用push_back添加新元素 vec.reserve(10); for(int i = 0; i < 10; i++) vec.push_back(1); //改变容器的大小,同时建立对象。 //resize有两个参数,第一个是容器大小,第二个参数时新加入容器的元素。 //调用这个函数以后,可使用[]添加新元素。 vec.resize(10); vec[0] = 0; //将第一个元素赋值为0
class Solution { public: int removeElement(vector<int>& nums, int val) { for(int i=0;i<nums.size();i++){ if(nums[i] == val){ nums[i] = nums.back(); nums.pop_back(); //对交换来的数组最后一个元素也进行检查,防止数组最后一个元素数值也等于val i--; } } return nums.size(); } };
class Solution(object): def removeElement(self, nums, val): """ :type nums: List[int] :type val: int :rtype: int """ while val in nums: nums.pop(nums.index(val)) return len(nums)