1.删除数组中指定的元素
//算法实现
int removeElement(int* nums, int numsSize, int val)
{
int src = 0;//nums[src] == val src++
int dst = 0;///nums[src] != val src++ dst++
while(src< numsSize)
{
if (nums[src] == val)
{
src++;
}
else
{
nums[dst] = nums[src];
src++;
dst++;
}
}
return dst;//删除了val的值 返回新数组的有效长度
2.合并两个升幂有序数组
//算法实现
void merge(int* nums1, int m, int* nums2, int n)//对两个递增数组进行排序
{
int L1 = m - 1;
int L2 = n - 1;
int L3 = m + n - 1;
while (L1 >= 0 && L2 >= 0)//只要有一个小于0就跳出循环
{
if (nums1[L1] > nums2[L2])
{
nums1[L3--] = nums1[L1--];
}
else
{
nums1[L3--] = nums2[L2--];
}
}
while (L2 >= 0) //此情况说明L2中还有剩余数据 需要依次放到num1中
{
nums1[L3--] = nums2[L2--];
}
}
3.代码测试
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include <windows.h>
//1.删除数组中指定的元素
int removeElement(int* nums, int numsSize, int val)
{
int src = 0;//nums[src] == val src++
int dst = 0;///nums[src] != val src++ dst++
while(src< numsSize)
{
if (nums[src] == val)
{
src++;
}
else
{
nums[dst] = nums[src];
src++;
dst++;
}
}
return dst;//删除了val的值 返回新数组的有效长度
}
int main()
{
int arr[] = { 1,2,3,4,1,2,1 };
int size = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i <size; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
int num = removeElement(arr, size, 1);
for (int i = 0; i < num; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
//2.合并两个升幂有序数组
void merge(int* nums1, int m, int* nums2, int n)//对两个递增数组进行排序
{
int L1 = m - 1;
int L2 = n - 1;
int L3 = m + n - 1;
while (L1 >= 0 && L2 >= 0)//只要有一个小于0就跳出循环
{
if (nums1[L1] > nums2[L2])
{
nums1[L3--] = nums1[L1--];
}
else
{
nums1[L3--] = nums2[L2--];
}
}
while (L2 >= 0) //此情况说明L2中还有剩余数据 需要依次放到num1中
{
nums1[L3--] = nums2[L2--];
}
}
int main()
{
int arr1[6] = { 4,5,6, };
int arr2[3] = { 1,2,3, };
for (int i = 0; i < 3; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
merge(arr1, 3, arr2, 3);
for (int i = 0; i < 6; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}