今天我们来进行顺序表后面习题的练习
目录
移除数组
它的示例如下:
思路1:查找后进行删除
如下图所示,当我们输入4的时候,进行第一次查找删除的操作
当我们执行完所有的流程之后,
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
void delete(int r, int* arr, int size)
{
int i = 0;
if (r!=0)
{
for (i = r - 1;i < size - 1;i++)
{
arr[i] = arr[i + 1];
}
}
}
int Find(int* arr,int size, int k)
{
assert(arr);
//遍历数组查找
for (int i = 0;i <= size - 1;i++)
{
if (k == arr[i])
{
//找到了
return i + 1;
}
else
{
continue;
}
}
return -1;//无效的下标表示没找到
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int r=Find(arr, 10, 5);
delete(r,arr,10);
for (int i = 0;i <9;i++)
{
printf("%d ", arr[i]);
}
return 0;
}
思路2:新数组交换:
思路:创建一个新的数组,当数组中的值不等于给定的值的时候将其赋值给新数组,然后将新数组的值赋值给旧数组
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
void delete( int* arr, int size,int k)
{
int *temp=(int *)malloc(sizeof(int)*size);
for (int i = 0,j=0;i < size;i++,j++)
{
if (arr[i] != k)
{
temp[j]=arr[i];
}
else
{
temp [j] =0 ;
}
}
for (int i = 0;i < size;i++)
{
arr[i] = temp[i];
}
}
int main()
{
int arr[10] = { 3,3,4,5,2,1,8,4,5 ,6};
delete(arr, 10, 5);
for (int i = 0;i <9;i++)
{
printf("%d ", arr[i]);
}
return 0;
}
思路3:双指针法:
思路:给定两个指针,分别为快指针和慢指针,慢指针在快指针遍历一次数组后向后移动一次。当快指针指向的值等于给定的值的时候,继续向后走;当不等于的时候,将快指针的数据赋值给慢指针,慢指针向后移动一格。
// 双指针
int removeElement(int* nums, int numsSize, int val) {
// slow为左指针,是将要赋值的位置;fast为右指针,是要赋值的元素
int slow = 0, fast = 0;
while(fast < numsSize){
// 若右指针元素不为val,它一定是输出数组中的元素,将右指针元素复制到左指针元素
if(nums[fast] != val){
nums[slow++] = nums[fast];
}
// 若右指针元素为val,它不为输出数组中的元素,左指针不动,右指针向后移动
fast++;
}
return slow;
}
删除重复项
示例:
思路:双指针法。第一个变量和第二个变量分别指向起始位置和后一个位置。
l力扣官方题解:
int removeDuplicates(int* nums, int numsSize)
{
int sec=0;int eoc=sec+1;
while(sec<numsSize)
{
if(nums[sec]!=nums[eoc]&&++sec!=eoc)
{
nums[sec]=nums[eoc];
eoc++;
}
sec++;
}
return sec+1;
}
合并两个有序数组
思路1:先合并再排序
思路2:空间换时间:创建新数组tmp,大小与nums大小相同,遍历两个数组的数据比较大小并放到tmp中
思路3:从后往前比较大小,找大的
L1和L3比较大小。当L3大的时候,将L3的数据赋值给L2,随后L2和 L3 分别向前移动一个位置;L1大的时候,L1 赋值给L3 ,L1和L3 向前移动一个位置。直到有一个越界了停止
代码如下:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int l1=m-1;
int l2=n-1;
int l3=m+n-1;
while(l1>=0&&l2>=0)
{
//比较大小,找大的
if(nums1[l1]>nums2[l2])
{
nums1[l3--]=nums1[l1--];
}
else
{
nums1[l3--]=nums2[l2--];
}
}
//要么l1越界,要么l2越界
while(l2>=0)
{
nums1[l3--]=nums2[l2--];
}
}
本期博客就到这里了。接下来我们将学习数据结构中单链表的内容