由于时间原因,有些题目应该更早发的,迫不得已推迟到现在,但是应发的题目数量是不会少的。坚持打卡!
1.根据所给数组,按要求删除数组中的某些元素,最后返回数组长度。
代码如下,该代码固定了初始数组。
#include <bits/stdc++.h>
#include <vector>
#include <algorithm>
using namespace std;
int removeElement(vector<int>& num,int val)
{
int slowindex=0;
int fastindex=0;
for(fastindex=0;fastindex<num.size();fastindex++)
{
if(num[fastindex]!=val)
{
num[slowindex]=num[fastindex];
slowindex++;
}
}
return slowindex;
}
int main()
{
vector<int> num={2,4,3,5,7,5};
int t=5;
cout<<removeElement(num,t);
return 0;
}
对于这道题,双指针法能够较为清晰的解决该问题,同时易于理解该方法。
大致思路:创建2个指针fast与slow,各司其职,fast指向的是数组中的元素即val,slow指向的是数组下标,当然两者均从初始位置开始,即num[0],首先就是要通过遍历该数组来找出要求删除的元素,这是fast的任务,而slow的任务是找到新数组,即原数组删除指定元素后剩余元素组成的新数组。通过for循环配合if语句可以解决。
2.给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
本来跟着视频学的方法挺不错的,但是最后总是出现一些问题不能运行,又尝试了新的方法,也挺不错,关键是可以正常运行,分享给大家。
#include <bits/stdc++.h>
#include <vector>
#include <algorithm>
using namespace std;
void square(vector<int>& nums)
{
vector<int> temp=nums;
int n=temp.size();
int k=n-1;
int i=0,j=n-1;
while(i<=j)
{
int left=nums[i]*nums[i];
int right=nums[j]*nums[j];
if(left<right)
{
nums[k--]=right;
j--;
}
else
{
nums[k--]=left;
i++;
}
}
}
int main()
{
vector<int> num={-2,4,5,6,7};
square(num);
for(int n:num)
{
cout<<n<<" ";
}
return 0;
}
和双指针的方法其实差不多,不一样的是创建了一个临时数组temp,复制原数组的数据。
里面值得注意的点:i<=j,至于为什么不能是i<j,是因为当i=j的时候循环就会停止退出,此时辉造成原有数组数据的遗漏错误。
另外就是if,else那里,left>right和left=right的情况相当于合并了,因为left=right时无论是 nums[k--]=left还是 nums[k--]=right都是等价的。