示例:
思路一:->一个一个移动(最差算法)
时间复杂度:O(n^2)
空间复杂度:O(1)
代码详情 :
//将数字移除
//依次移动
int RemoveElement(int* arr, int sz, int x)
{
int count = 0;//记录移除了几个数字
//找到一个x就将后面的数据往前挪动一位
for (int i = 0; i < sz; i++)
{
if (arr[i] == x)
{//移除
for (int j = i; j < sz; j++)
{
arr[j] = arr[j + 1];
}
count++;
}
}
return sz - count;
}
int main()
{
int arr[] = { 1,2,3,4,1,2,3 };
int sz = sizeof(arr) / sizeof(arr[0]);
int x = 0;
printf("请输入移除的数字:");
scanf("%d",&x);
int j = RemoveElement(arr,sz,x);
//打印
for (int i = 0; i < j; i++)
{
printf("%d ",arr[i]);
}
}
思路二:新建一个数组,把不为x的数字拷贝到新数组里面,然后再赋值给原数组(适中算法)
时间复杂度:O(n)
空间复杂度:O(n)
代码详情 :
int RemoveElement(int* arr, int sz, int x)
{
int brr[100] = { 0 };//创建一个空间较大的数组
int j = 0;
//将数组arr中不为x的数字,赋值给数组brr
for (int i = 0; i < sz; i++)
{
if (arr[i] != x)
{
brr[j++] = arr[i];
}
}//将数组brr中的值赋值给数组arr
for (int i = 0; i < j; i++)
{
arr[i] = brr[i];
}
*brr = NULL;
return j;
}
//创建一个新的数组,存放数字
int main()
{
int arr[] = { 1,2,3,4,1,2,3 };
int sz = sizeof(arr) / sizeof(arr[0]);
int x = 0;
printf("请输入移除的数字:");
scanf("%d",&x);
int j = RemoveElement(arr,sz,x);
//打印
for (int i = 0; i < j; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
思路三:强制转换(最优算法)
->时间复杂度:O(n)
空间复杂度:O(1)
代码详情 :
int RemoveElement(int* arr,int sz,int x)
{
int str = 0;
int dst = 0;
//强制转换
for (int str = 0; str < sz; str++)
{
if (arr[str] != x)
{
arr[dst] = arr[str];
dst++;
}
}
return dst;
}
//更优算法
int main()
{
int arr[] = { 1,2,3,4,1,2,3 };
int sz = sizeof(arr) / sizeof(arr[0]);
int x = 0;
printf("请输入移除的数字:");
scanf("%d",&x);
int dst = RemoveElement(arr,sz,x);
//输出
for (int i = 0; i < dst; i++)
{
printf("%d ",arr[i]);
}
return 0;
}