原地删除数据
我们的思路这里给的是双指针,给两个指针,从前往后移动,如果不是val就覆盖,如果是我就跳过,大家一定要看到我们的条件是原地修改,所以我们不能另开一个数组来实现我们这道题目。
这里我们给两个数组,一个是dst,一个就是我们的src,我们让src往后移动,遇到val就++,如果不是val我们就覆盖,大家也看到我们今天的主题是顺序表,说明我们的题目内容也最好和顺序表有点关系,顺序表的本质就是数组,所以我们这里还是用数组下标来访问可能更好,当然指针肯定也能实现。
int removeElement(int* nums, int numsSize, int val){
int dst = 0;
int src = 0;
while(src < numsSize)
{
if(nums[src] != val)
{
nums[dst++] = nums[src++];
}
else
{
src++;
}
}
return dst;
}
这样我们的代码就能通过,这里我们还需要做的就是返回这个数组的有效数据,这里我建议大家自己举例子来说明,我的想法是我们每次覆盖之后dst都会++,所以dst指向的位置应该是有效位置的后一个,因为我们的数组下标是从0开始的,所以还是dst,但是dst指向的是有效数据的后一位。
删除有效的数据的重复项
int removeDuplicates(int* nums, int numsSize){
int dst = 0;
int src = 0;
while(src < numsSize)
{
if(nums[dst] != nums[src])
{
nums[++dst] = nums[src++];
}
else
{
src++;
}
}
return dst+1;
}
其实这里还是双指针的思路,如果相同我们就src++,不同的话我们先让dst++,然后再进行覆盖
其实大家自己去移动控制就可以算出来了,这里大家也可以让src从1开始,从1开始的话可能好比较一点,但是我们的思路是大差不差。
合并有序数组
首先我们看题目,可以想出两种做题的思路,第一种就是我们可以重新开辟一个空间,然后我们还是继续用双指针的办法,给两个指针指向我们nums1和nums2开始的地方,然后比较小,谁小谁先放入,一个到尾巴就结束,然后把剩下的放进去就可以了,但是我们这里看到数组1的空间其实足够大,那我们就不用考虑这么多,我们可以再nums1中进行操作。
我们比较谁大就放到后面去,然后有一个end变成0就得结束了,要不然会越界。
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int end1 = m - 1;
int end2 = n - 1;
int tail = m + n -1;
while(end1 >= 0 && end2 >= 0)
{
if(nums1[end1] > nums2[end2])
{
nums1[tail--] = nums1[end1--];
}
else
{
nums1[tail--] = nums2[end2--];
}
}
while(end2 >= 0)
{
nums1[tail--] = nums2[end2--];
}
}
10月底了,学校课真的好多,想旷课但是要点名,真的好烦,进度慢了好多了这个月,再加上手骨裂了,敲代码慢很多唉。