今天复习软考程序题,发现很多知识点很难应用到程序上。睡觉之前做个笔记整理一下,也是方便以后复习了。
首先问题是,对于具有n个元素的整型数组a,需要进行处理的是删除a中的所有值为0的数组的元素,并将a中所有非零的元素按照原顺序持续地存储在数组空间的前端,并且最后返回非零元素的个数。
解决思路是先申请一个与数组a的大小相同的动态数组空间,然后依次扫描数组a中的每一个元素,将非零的元素依次复制到新申请动态数组空间,到最后再将动态数组中的元素传回a中。
代码如下:
这个函数的思路很容易理解,但是由于数组a的数据需要复制给temp然后再复制回来,因此需要有更多的空间支持,处理速度的时间也会更长。而且这段代码也存在一定的缺点,因为有可能由于申请内存空间的要求得不到满足,从而导致函数的功能不能实现,而且最后也没有释放动态数组空间,存在内存泄露问题。
还有另外一种解决的思路:利用下标i(初值为0)一次扫描数组a的每一个元素,下标k(初值为0)表示数组a中连续存储的非0元素的下标。扫描时,每遇到一组数组元素,i就增加1,而遇到非零元素并且将其前移后k才增1。
代码如下:
其实解决同一种问题有很多种不同的方法,每个方法都有自己的特点,所以在解决问题的时候应该多考虑,选择更好的解决方案。