#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//常规方式通常是遍历数组,然后找到一个把后面的往前挪
//void delstr(int * ps, int Size,int x)
//{
// int i = 0;
// while (i < Size)
// {
// if (ps[i] == x)
// {
// printf("%d", ps[i]);
// int k = i;
// while (k < Size)
// {
// ps[k] = ps[k + 1];
// k++;
// }
// Size--;
// }
// else
// {
// i++;
// }
// }
// printf("\n");
// for (int i = 0; i < Size; i++)
// {
// printf("%d", ps[i]);
// }
//}
//此时的空间复杂度O(N**2)

void delstr(int * ps, int Size, int x)
//第一个参数是接收数组的指针,第二个是数组元素个数[用于遍历数组],第三个是要删除数组中的值
//当要求时间复杂度为O(N)空间复杂度为O(1)时,可以采取这种方式
{
int src = 0, dst = 0;
//先定义两个变量,两个都指向数组的开头,即都为0,
//第一个变量src用于遍历整个数组,
//第二个变量dst用于记录不等于X的数字的个数
while (src < Size)
{
if (ps[src] != x)
//当遍历的元素不等于x时,就把ps[dst]赋给ps[src],然后再进行++
//当遍历到的元素等于x时,仅把src++
//就可以错开dst和src,之前说到dst指向的其实都不是等于X的个数,那么当下一次不等于x的时候,那个不等于X的数就会替换掉数组中上一个X的位置
//最终我们得到的数组即可用dst作为元素个数去遍历
{
ps[dst++] = ps[src++];
}
else
{
src++;
}
}
//遍历数组
for (int i = 0; i < dst; i++)
{
printf("%d", ps[i]);
}
}

int main()
{
int arr[] = { 1, 2, 3, 4, 3, 6, 3, 3, 9, 3, 8, 2 };
int size = sizeof(arr) / sizeof(arr[0]);
delstr(arr,size, 3);
return 0;
}

©著作权归作者所有:来自51CTO博客作者intmain233的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 顺序表
  2. ArrayList和LinkedList的区别?
  3. 2020-03-01:给定一个非负数组arr,代表直方图。返回直方图的最大长
  4. 2021-02-28:给定一个整型数组arr,和一个整数num。某个arr中的子数
  5. 各种类型的指针作业解析(C语言)
  6. C/C++实现在一组排列好的数中插入一组数,并按照原先排列方式进行
  7. 2021-02-26:一个数组arr是二叉树的中序遍历结果,每条边的开销是父
  8. 【java】面试官问我,如何实现一个自定义序列化
  9. 【redis】使用redis位图轻松实时统计日活

随机推荐

  1. 如何把Eclipse工程导入到Android(安卓)St
  2. Android单元测试之Robolectric
  3. 从Android到React Native开发(一、入门)
  4. Android多线程(三)HandlerThread源码原理解
  5. 一个查看xhprof数据文件的docker镜像
  6. 教你用php读写csv格式的文件
  7. 详解PHP位运算符
  8. 初学php,你遇到过这个低级问题吗?
  9. 一个php框架的简单实现,仅实现简单路由层
  10. 关于PHP打印格式化显示利器