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 ...
随机推荐
- C#多线程方法 可传参
//将线程执行的方法和参数都封装到一个类里面.通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递参数.using System; using System.Threading; //Thre ...
- DE2之7-segment displays
以前课题用的是友晶的DE2-70,现在重拾FPGA,选了一款性价比高的DE2.恰逢闲来无事,于是尝试将各个Verilog模块翻译成VHDL,半算回顾以前的知识,半算练习VHDL. Verilog 01 ...
- XML知识总结
1.XML概念及作用? XML( eXtensible Markup Language,可扩展标记语言)是一种简单的数据存储语言 作用:用来存储和交换数据 无法描述页面的排版和显示形式 2.XML和X ...
- String类面试坑题
1.面试坑题F:\SHJT\JavaWorkspace\JavaSE\workspace\day13ezra\src\cn\itcast\sh\classcode\BTStringLastIndexO ...
- 安卓Java读取SD卡文本文件
在进行序列识别时,需要对多个模式串进行识别,需要对多行浮点数进行读取,并进行解析. 所以使用的方法为: 使用文本多行读取的方式:对每行文本进行正则表达式匹配:再进行字符转换. 代码如下: ...
- 09--c++ 类的继承与派生
c++ 类的继承与派生 一.基本概念 1.类的继承,是新的类从已有类那里得到已有的特性.或从已有类产生新类的过程就是类的派生.原有的类称为基类或父类,产生的新类称为派生类或子类. 2.派生类的 ...
- emlog通过pjax实现无刷新加载网页--完美解决cnzz统计和javascript失效问题
想要更详细了解pjax,需要查看官网 或者看本站文章:jQuery.pjax.js:使用AJAX和pushState无刷新加载网页(官网教程中文翻译) 效果看本站,音乐无刷新播放,代码高亮和复制js加 ...
- nginx_安装测试
首先安装环境: [root@local nginx-1.9.14]# yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl op ...
- console.log、toString方法与js判断变量类型
Java调用system.print.out()是会调用toString方法打印js里的console.log也是控制台打印,很多时候,我们以为也是调用toString方法,其实并不是.我们在chro ...
- html第六节课
JavaScript 一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系 ...