删除数组中的指定数字
今天在百度知道上看到一个问题:
编写一个函数void fun ( int bb[ ], int *n, int y ),其中*n表示bb数组中元素的个数。 函数功能:删除bb中所有值为y元素,bb数组元素的值和y的值由主函数通过键盘读入。
作者的源代码是这样的:
1 void fun ( int bb[ ], int *n, int y )
2 {*******************下面是我填写的,不知道错哪了**********************
3 int i,pos=*n;
4 for(;pos>0;pos--)
5 if(bb[pos]==y)
6 {
7 for(i=pos;i<*n;i++)
8 bb[i]=bb[i+1];
9 (*n)--;
10 }
11 ****************************以上**********************************
12 }
也没想他到底哪里错了,估计是数组什么的越界了。。。我发现他的解法每发现一个y都要移动元素,于是就像写一个综合移动的方法:
先计算每个数组元素前y出现的次数yCount,然后将该元素移动yCount。
这本来是一个挺简单的想法,我觉得也用不了多长时间吧,还能拿到悬赏的190分,况且这也算是练练写代码嘛,嘿嘿。于是从11点开始写,写到下午3点了竟然。。。:
1 void fun(int bb[], int& n, const int y)
2 {
3 int p1, p2, yCount, step;
4 p1 = 0;
5 yCount = 0;
6 while(p1 < n && bb[p1] != y)
7 {
8 p1++;
9 }
10 p2 = p1;
11 step = 0;
12 while (p2 < n)
13 {
14 while (p2 < n && bb[p2] != y)
15 {
16 step++;
17 p2++;
18 }
19 int oldCount = yCount;
20 while(p2 < n && bb[p2] == y)
21 {
22 p2++;
23 yCount++;
24 }
25 while (step > 0)
26 {
27 bb[p1] = bb[p1+oldCount];
28 p1++;
29 step--;
30 }
31 //step = 0
32 }
33 n -= yCount;
34 }
这段代码,看起来应该挺规范,恩,起码比起一开始的想法算是简洁多啦。编码中遇到的问题主要是一开始用的if条件判定太多了,一开始将p1指定到了发现第一个y的地方,这样就又多了几行代码。写成看了看发现代码太“苗条”,像根棍似的,于是就试着改了改。终于改成了现在的3个while判定。这种风格还是从归并的源码中学习的。3个while要想实现代码,还需要安排相互之间的顺序,移动了半天都没调试通过。后来写了神来一笔: int oldCount = yCount;才终于解决了最后一个y以后的数组元素移动跟它以前的数组元素移动bb[p1] = bb[index]中index需要根据情况取值不同的问题。这个old~什么的,还是前几天看VC++难点剖析学会的,没想到在这个时候用上了,哈哈。
今天编码通过。发现自己写代码的能力太差了。原来想法跟实现之间差距挺大,怪不得人们都说不编码的人不能做需求,原来理想跟现实之间的差距还是挺大。唯有以后认真学习写代码,多看标准代码来弥补了。

浙公网安备 33010602011771号