数组移除元素 有序数组的平方

由于时间原因,有些题目应该更早发的,迫不得已推迟到现在,但是应发的题目数量是不会少的。坚持打卡!

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都是等价的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值