前几天我们学习写完了顺序表,还是得巩固练习一下的,所以今天就练习几道题把。
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,感谢观看