当前栏目
移除元素问题解决方法------LeetCode-OJ题
问题:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
要求:
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
OJ代码:
int removeElement(int* nums, int numsSize, int val){
int src=0;
int des=0;
while(src<numsSize)
{
if(nums[src]!=val)
{
nums[des++]=nums[src++];
}
else
{
++src;
}
}
return des;
}
解析:
src,des,是数组的两个下标。通过这两个下标的移动来给数组赋值。
假设输入的val是 2
while(src<numsSize) 成立,进入循环
nums[src] ! = val 所以if 条件成立。执行语句 nums[des++] = nums[src++];
也就是把nums[src] 的值赋值给 nums[des];
再进行加一操作。
它会判断现在的src 是否满足循环的条件,如果小于numsSize 则继续进行,
如果不满足条件,就会退出循环。
现在,nums[src] = = val; 进行else 语句
++src; 就是 src 下标进行加一操作,不进行赋值操作。
因为我们的目的就是移除 val 元素,保持des下标不变,最后要返回数组。
src加一后 nums[src] 就又不等于 val 了,所以继续执行if 语句。
nums[src] 的值赋值给 nums[des];
所以现在 nums[src]的值就是 3
两个下标再进行加一操作。
它会判断现在的src 是否满足循环的条件,如果小于numsSize 则继续进行,
如果不满足条件,就会退出循环。
现在 nums[src] 又等于 val; 所以进行else 语句。
src 下标进行加一操作,不进行赋值操作。
加一之后,nums[src] 又还等于 val; 所以还是进行else 语句。
此时, nums[src] 就不等于 val 了,所以执行if 语句。
nums[src] 的值赋值给 nums[des];
所以nums[des] 的值就是 4 了。
两个下标再进行加一操作。
nums[src] 又不等于 val 了,所以继续执行if 语句。
nums[src] 的值赋值给 nums[des];
所以现在 nums[src]的值就是 3
此时两个下标再进行加一操作
但是,scr的值会超过numsSize,所以会跳出循环。
然后 return des; 所以现在的数组就是移除val 值后的数组了。
相关文章
- 一文走进 HTTP 与 TCP 协议
- 《Spring Boot 实战纪实》之过滤器
- 《Spring Boot 实战纪实》之缺失的逻辑
- 《Spring Boot 实战纪实》之关键点文档
- 《Spring Boot 实战纪实》之如何攥写需求文档
- 《Spring Boot 实战纪实》之需求管理
- 《Spring Boot 实战纪实》之前言
- 我的AngularJS 学习之旅(二)
- Silverlight TreeView 动态绑定Xml 文件
- 安装node.js与webpack创建vue2项目
- Feign 进行rpc 调用时使用ribbon负载均衡源码解析
- Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
- 我的JavaScript工具链,6个改变了我的JavaScript的工具
- 敲代码也要讲“基本法”:​程序员应该遵守的编码原则
- 前端开发者不得不知道的18个常用的网站
- 研究一下Spring里面的源码,循环依赖你会么?
- 13年前的罕见老照片:乔布斯和Google大佬会面
- 为什么某些HTML元素被弃用?
- HTTP 及 http 请求解析过程
- 大前端时代下,谈谈Web前端开发的8个的趋势