当前位置: 首页 > news >正文

泰安企业建站公司平台合肥建设云app

泰安企业建站公司平台,合肥建设云app,c PHP做网站对比,h5网站开发平台⭐今日份题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…

⭐今日份题目

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);
​
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {print(nums[i]);
}

示例1

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。

示例2

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,3,0,4]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

提示

  • 0 <= nums.length <= 100

  • 0 <= nums[i] <= 50

  • 0 <= val <= 100

⭐题目思路

这里还是提取一下题目的特征点:

  • 原地移除

原地移除,考虑用vector作为STL库中一员的erase函数,该函数可以在原数组中直接删除对应位置的元素,基本语法:

vector.erase(vector.begin()+i)//表示删除掉数组中下标为i的元素

这样的好处是无需额外的变量空间,但问题也随之产生:⭐原地删除后vector中的元素的下标会对应的发生变化,vector的长度也对应发生变化,那么就需要额外考虑下标的处理问题。大致有以下几个方面:

  • 删除掉下标为i的元素后,新一轮的for循环中下标为i的元素其实是还未被遍历过的,所以需要i--来遍历这个元素。

class Solution 
{
public:int removeElement(vector<int>& nums, int val) {for(int i=0;i<nums.size();i++){if(nums[i]==val) {nums.erase(nums.begin()+i);i--;}}return nums.size();}
};

该方法的执行用时和内存消耗如下图所示:

仍有进步的空间。

在之前调试的时候,我发现了一个很奇怪的现象,我在return前加了一句代码:

if(nums.size()==1&&nums[0]==val) return 0;

然后运行用时就变为了0ms,然后内存消耗反而增大了。这里我其实不是很理解,欢迎大佬们帮我解答一下,评论区见~

这道题也是有点典型的STL风,感兴趣的初学朋友可以去看一下~

⭐vector补充知识

vector还有一些常用的函数,这里补充一下:

//定义一个vector,类型为int
vector<int> a;
//定义一个int型长度为10的vector
vector<int> b(10);
//定义一个int型长度为10,初始值均为3的vector
vector<int> c(10,3);//将vector中的最后一个元素改成4
a.back()=4;
⭐(这个符号表示时间复杂度) O(1)
//清空vector
a.clear();
⭐ O(n)
//在vector末尾增加一个3
a.push_back(3);
⭐ O(1)
//删除末尾元素
a.pop_back();
⭐ O(1)//该部分比较少用,时间复杂度都为O(该变量)
//截取长度为11,缺的补0,不缺就直接截取
a.resize(11);
//截取长度为11,缺的补5
a.resize(11,5);//判断元素个数
a.size();
⭐ O(1)
//判断vector中是否无元素了,没有了就返回true
a.empty();
⭐ O(1)//vector作为迭代器
a.begin();//返回a的第一个元素的位置
a.end();//返回a的最后一个元素的下一个位置
sort(a.begin(),a.end());//插入删除,慎用,因为时间复杂度为O(n),有点慢
//在下标为2(从0开始)的位置插入0元素
a.insert(a.begin()+2,0);
//删除下标为2的元素
a.erase(a.begin()+2);
//删除区间,左闭右开
a.erase(a.begin()+1,a.begin()+4);

⭐一切会让vector长度变化的操作都可能让之前的迭代器失效,这也是该题目我们需要额外考虑的地方。

这里如果有不懂的地方欢迎评论区留言⭐~

⭐代码

class Solution 
{
public:int removeElement(vector<int>& nums, int val) {for(int i=0;i<nums.size();i++){if(nums[i]==val) {nums.erase(nums.begin()+i);i--;}}if(nums.size()==1&&nums[0]==val) return 0;return nums.size();}
};

提交结果

我的代码还有待改进,欢迎大家提供更高效的代码,如果过后有更优化的思路我还会继续更新的,大家评论区见!

点赞收藏不迷路⭐~

http://www.yayakq.cn/news/224373/

相关文章:

  • 上海做高端网站建设php网站开发工具
  • 北京大兴地区网站建设程序员招聘求职的网站
  • 在哪里做企业网站网站界面设计的要求
  • 做pop网站网页设计布局图
  • 制作网站的工作流程深圳制作网站的公司
  • 网站服务器租赁需要什么手续asp网站开发国内外现状
  • 产品review网站怎么做四川个人网站备案
  • 仿朋友圈网站建设wordpress全站使用cdn
  • 免费的网站域名公司网站维护主要做什么
  • 电影网站系统源码wordpress积分换购
  • 烟台专业的做网站公司aisinoty810色带
  • 北京网站设计必看刻免费的设计软件
  • 欧米伽官方网站手表价格网络服务器是什么
  • 苏州网站建设致宇电子商务网站推广的主要方法
  • 大型网站建设套餐php实现网站tag标签
  • 网站上的图片带店面是怎么做的wordpress特定用户
  • 长沙做网站seo北京自己怎么做网站
  • 石家庄网站推广公司互联网广告是做什么的
  • 福田网站建设有限公司论坛推广的特点
  • 爱站工具包曲靖市住房和城乡建设局网站
  • 网站制作网站建设需要多少钱个人域名 做公司网站
  • 黑彩网站怎么建设网站开发用到什么技术
  • 做网站怎么上传网站建设客户人群
  • 佛山营销网站建设新手搭建做网站
  • 网站建站网站看看wordpress 域
  • 找网站开发项目app营销的核心是什么
  • 网站后台会员管理天津培训网站建设
  • 哈尔滨专业做网站网页制作与设计alt什么意思
  • 电商优惠券网站 建设网站定制公司kinglink
  • 董家渡街道网站建设怎么制作自己的水印