1.移除数组
思路1:创建新的数组,遍历原数组,将不为val的值放到新数组中
但是题目中有一个限制,所以这个思路不通过
思路2:双指针法
创建俩个变量src,dest
1.如果src指向的值为val,则src++
2.如果src指向的值不为val,则把src指向的值赋给dest(nums[dest]=nums[src]),赋完值之后src++,dest++
int removeElement(int* nums, int numsSize, int val)
{
//创建俩个变量指向数组的起始地址
int src,dest;
//都指向下标为0的位置
src = dest = 0;
//numsSize:数组的长度
while(src < numsSize)
{
//如果src指向的是val
if(nums[src] == val)
{
src++;
}
//如果src指向的不是val,则src和dest先赋值再++
else
{
(nums[dest]=nums[src]);
src++;
dest++;
}
}
//这个时候dest的长度就是有效长度
return dest;
}
2.合并俩个有序数组
思路1:将num2中的数据依次放到num1中,按照排序算法进行排序
第一种情况:l2先出循环
为了防止数据的覆盖,所以是从后往前比大小:大的放在后面
第二种情况:l1先出循环,num2中还有数据为放到num1中
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
//nums1Size:num1数组的长度 nums2Size:num2数组的长度
int l1 = m-1;
int l2 = n-1;
//有效数组m+n再-1的下标
int l3 = m+n-1;
//下标>=0才能有效的进行循环
while(l1 >= 0 && l2 >= 0)
{
if(nums1[l1] < nums2[l2])
{
//如果l1指向的值小于l2指向的值,那么就把l2指向的值赋给l3,再同时--
nums1[l3--]=nums2[l2--];
}
else
{
nums1[l3--]=nums1[l1--];
}
}
//只需要处理一种情况,那就是l2>=0,也就是l2中的数据还没有完全放到nums1中
while(l2>=0)
{
nums1[l3--]=nums2[l2--];
}
}
如果l2>=0,那么就是l2中的数据还没有完全放到nums1中