27. Remove Element[E]移除元素
题目
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.
思路
题目要求不使用额外的空间,移除所有数值等于val的元素,返回新数组的长度,于是想到使用替换的方法。
将数组中数值等于val的元素与数组最后一个元素互换,再将最后一个元素删除。这样就完成了一个删除数值等于val元素的操作。
Tips
STL中的容器vector
(1)声明以及初始化
//声明一个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);
(2)元素访问
//下标访问,不会进行越界检查
vec[0]
//at访问,会检查越界,如果出界会抛出out of range 异常
vec.at(0)
//访问第一个元素
vec.front()
//访问最后一个元素
vec.back()
(3)元素修改
//在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();
(4)元素容量
在容器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
C++
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();
}
};
Python
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)
27. Remove Element[E]移除元素的更多相关文章
- LeetCode 27. Remove Element (移除元素)
Given an array and a value, remove all instances of that value in place and return the new length. D ...
- 27. Remove Element C++移除元素
网址:https://leetcode.com/problems/remove-element/ 双指针(广义) class Solution { public: int removeElement( ...
- LeetCode 27 Remove Element (移除数组中指定元素)
题目链接: https://leetcode.com/problems/remove-element/?tab=Description Problem : 移除数组中给定target的元素,返回剩 ...
- LeetCode OJ:Remove Element(移除元素)
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- 27. Remove Element【leetcode】
27. Remove Element[leetcode] Given an array and a value, remove all instances of that value in place ...
- [Leetcode][Python]27: Remove Element
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 27: Remove Elementhttps://oj.leetcode.c ...
- 27. Remove Element【easy】
27. Remove Element[easy] Given an array and a value, remove all instances of that value in place and ...
- leetCode练题——27. Remove Element
1.题目 27. Remove Element——Easy Given an array nums and a value val, remove all instances of that valu ...
- leetCode 27.Remove Element (删除元素) 解题思路和方法
Remove Element Given an array and a value, remove all instances of that value in place and return th ...
随机推荐
- 2、scala条件控制与循环
1. if表达式 2. 句终结符.块表达式 3. 输入与输出 4. 循环 5. 高级for循环 1. if表达式 if表达式的定义:scala中,表达式是有值的,就是if或者else中最后 ...
- sql server 查询数据判断为空
and xxx is NOT null and xxx is null
- HTML5 video常用属性
一.视频video常用标签方法 <!-- controls 控制条,播放暂停等 controlslist 控制不允许全屏 不允许下载等 poster 封面 autoplay 自动播放 muted ...
- Arrays工具类的使用
1.包: java.util 导包 2.此类包含用来操作数组(比如排序和搜索)的各种方法 特点: 该类中的方法都是静态方法,所以可以直接使用类名.方法名(实参)调用 3.查看成员方法: public ...
- BZOJ 1984月下“毛景树” LCT维护边权 + 下传标记
Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树” ...
- Linux:只复制文件权限和所有者
在Linux上,怎么把一个文件的<权限和所有者>赋给另一个文件呢? chown命令可以设置所有者和用户组:chmod可以设置文件的权限.这两个命令都支持使用另一个文件做为引用(RFILE) ...
- DATEPART()
定义和用法 DATEPART() 函数用于返回日期/时间的单独部分,比如年.月.日.小时.分钟等等. 语法 DATEPART(datepart,date) date 参数是合法的日期表达式.datep ...
- JS常见的四种设计模式
1 工厂模式 简单的工厂模式可以理解为解决多个相似的问题; function CreatePerson(name,age,sex) { var obj = new Object(); obj.name ...
- 结构体、枚举、联合(day14)
一个存储区的地址必须是它自身大小的整数倍 (double类型存储区的地址只需要是4的 整数倍) 这个规则叫数据对齐 结构体里面的子存储区通常也需要遵守数据 对齐的规则 数据对齐会造成结构体内部子存储区 ...
- 学习Linux服务的方法
1.服务的概述:名字.功能.特点.原理.端口号 2.安装 3.配置文件的位置 4.服务器启动.关闭的脚本,查看端口 5.此服务的使用方法 6.修改配置文件,案例部署 7.排错调优