题目一
对于上面的题,有以下的两种思路
思路一:
定义一个顺序表,然后遍历数组,如果数组里面的元素等于val的值,就让这个值等于0就行了,然后输出的时候输出不是0的就行了
代码实现1
#include<stdio.h>
int main()
{
int arr[] = { 3,2,2,3 };
int val = 2;
int sz = sizeof(arr) / sizeof(arr[0]);
int sz_temp = sz;
for (int i = 0; i < sz_temp; i++)
{
if (arr[i] == val)
{
arr[i] = 0;
sz_temp--;
}
}
for (int i = 0; i < sz; i++)
{
if (arr[i] != 0)
{
printf("%d ", arr[i]);
}
}
printf("\n");
printf("%d", sz_temp);
return 0;
}
思路二:
多指针算法(这个在leetcode上面实现)
定义两个指针,分别为指针1和指针2,同时指向第一个元素,如果指针1对应的元素等于val,指针1加1,并且将指针1的元素赋值给指针2
如果指针1的值不等于val的值的话,指针1和指针2同时加1
最后指针2指向的下标就是元素的个数了
题目二
思路一:
可以先合并两个数组,再对数组进行排序,但是这样的算法思想虽然暴力,但是实现起来有点复杂,所以不建议
思路二
在这里可以定义三个指针
对l2和l3指针对应的下标的元素进行比较,如果l2对应下标的元素更大,就把他放在l1对应的位置,同时l1和l2同时减1,否者的话把l1和l3同时减1,
如果l3先变成0的话,不用管
但是如果l2先变成0的话,证明上面的数组的元素大的个数更多,在之前的操作中大的数组前面比较小的数已经移到后面去了,这是就要把下面数组的元素搬到上面去