关于顺序表的练习

前几天我们学习写完了顺序表,还是得巩固练习一下的,所以今天就练习几道题把。

1.移除元素(消除元素

  

这道题规定了我们的空间复杂度,我们在原数组进行遍历一下,将不是val的值存进一个新的数组里即可,这个数组我们在遍历数组的时候记录一下,应该开辟多大的空间,这是我们一般题的解决思路,但是这道题要求我们要原地修改,也就是我们边遍历,边往进放。所以我们只需要定义两个指针,一个指针负责遍历,一个负责接受不是val的值,第二个指针和第一个指针遇到不是val的值就越过,遇到是的第一个指针接着向前遍历,第二个停下,停在是val的地方,第一个接着遍历,直到遇到不是val的值,第二个指针把它存进去,再往前走,思路清晰,代码实操。

int removeElement(int* nums, int numsSize, int val) 
{
   int ps=0,ret=0;
   while(ps<numsSize)
   {
    if(nums[ps]==val)
    {
        ps++;
        
    }
    else
    {
        nums[ret]=nums[ps];
        ps++;
        ret++;
    }
   }
   return ret;
}

2.合并有序数组合并有序数组

把数组2合并到数组1上,首先要求就是数组1的空间足够,接着还要求我们要形成非递减顺序的数组,我们两个思路,可以边排序,边插入,也可以先把两个数组头尾想接再进行冒泡排序,第二种比较实现,我们尝试第一个。我们假想一下,如果是从头开始遍历两个数组,那么数组一的元素需要一直向后挪动,一边比较一边挪,这样是不是非常麻烦。那我们试试从后面开始。因为数组是有序的,所以最后一个是最大的,那就比较两个数组谁更大,就往后边放,放一个,就把指针的位置往前一个,直到排完,

怎么实现呢?三个指针是不是需要,一个指向数组一有效数据的末,一个指针指向数组二的末端,最后一个指针指向数组一的末端,接着开始第一个指针和第二个指针的遍历。我们需要注意的就是万一遍历的时候有一方数组已经遍历完了怎么,如果是数组一遍历完了,那直接把数组二存进去就行了,如果是数组二提前遍历完了,那就直接输出就行,已经思路清晰,代码实操。

void merge(int* arr1, int size1, int m, int* arr2, int size2, int n) {
    
 int ps1=m-1;
 int ps2=n-1;
 int ps3=m+n-1;
 while(ps1>=0&&ps2>=0)
 {
    if(arr1[ps1]>arr2[ps2])
    {
        arr1[ps3]=arr1[ps1];
        ps3--;
        ps1--;
    }
    else
    {
        arr1[ps3]=arr2[ps2];
        ps3--;
        ps2--;
    }
 }
 
    while(ps2>=0)
    {
        arr1[ps3]=arr2[ps2];
        ps3--;
        ps2--;
    }
 
 
}

ok,感谢观看

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值