20240409每日一题题解
Problem
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
Solution
这道题又是道Python特化题。是考察Python中的list
这种容器的。既然我要写的是c++的题解,那么我就和大家聊点c++的东西吧。
引用
我们前不久学习了引用的用法。引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
引用与指针的区别
引用很容易与指针混淆,它们之间有三个主要的不同:
- 不存在空引用。引用必须连接到一块合法的内存。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
引用的使用方法
创建引用
int i=521;
//下面声明一个“引用变量”
int& JiaMuGe_Birthday=i;
在这里,&
符号读作引用
。此时此刻,变量JiaMuGe_Birthday
和i
是完全等效的。修改其中的任何一个的值,输出另一个变量,会发现结果也变了(因为他们本来就是同一个东西了嘛)
数组模拟
没啥好写了。我们试着用数组来模拟这道题吧。
一共只有两个步骤:
- 从前往后扫描数组
- 如果遇到了和
val
相等的数据,则将其删除(把后面的数据向前挪一格)
由于数组没有删除某个元素这种说法,所以我们就用把后面的数据向前挪一格模拟删除这个操作吧。
#include<iostream>
using namespace std;
int a[1000];
int n,val;
int main()
{
cin>>n>>val;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
//Solution Start
int i=1;
while(i<=n)
{
if(a[i]==val)
{
// 如果当前元素等于val,将后面的元素都向前移动一位
for(int j = i; j < n - 1; j++)
{
a[j] = a[j + 1];
}
n--; // 数组长度减1
// 注意这里不需要i++,因为我们移动了元素后,需要在新位置重新检查当前i指向的元素
}
else
{
// 如果当前元素不等于val,继续检查下一个元素
i++;
}
}
//Solution Finish
cout<<n<<endl;
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
vector实现
c++中的数组并不对标python中的list
。如果您也想要在c++中尝试到如list
一般的功能多样但更加高效的工具,不妨试试vector
。
#include<iostream>
#include<vector>
#include<algorithm> // 用于std::remove
using namespace std;
int n,val;
int main()
{
cin>>n>>val;
vector<int>nums(n);
for(int i=0;i<n;i++)
{
cin>>nums[i];
}
//Solution Start
// 使用remove将所有不等于val的元素移到vector的开始位置
auto new_end = remove(nums.begin(), nums.end(), val);
// 使用erase删除从new_end到nums.end()的所有元素
nums.erase(new_end, nums.end());
// 更新n为新的长度
n = nums.size();
//Solution Finish
cout<<n<<endl;
for(int i=0;i<n;i++)
{
cout<<nums[i]<<" ";
}
return 0;
}
标签:end,val,nums,int,题解,每日,20240409,引用,数组
From: https://www.cnblogs.com/Vanilla-chan/p/18124987