如有错误请及时留言,我好及时修改避免误导更多人,谢谢!
一道华为编程题目,int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序(按原来顺序),返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
思路如下:
1.定义两个变量z、nz,分别用来跟踪数组里面的元素两类元素的位置。
z跟踪0的位置,nz跟踪非零元素位置。用flag来记录第一为0元素的位置。
2.程序首先用一个for循环来寻找第一0元素的位置,并用flag记录下来。
并且用此值将n、nz初始化。
3.然后用while死循环里面嵌套两个for循环,一个用来查找0元素位置,
一个用来查找非0元素位置。找到立即break,跳出for循环。
4.在while中、for外,进行0元素和非0元素位置交换。
5.最后判断非零元素记录变量nz是否到达数组末尾,到达立即跳出返回,否则从3循环。
程序编译测试环境为dev-c++4.9.9.2,源码如下:
#include <stdio.h>
#include <stdlib.h>
int Func(int *a, int nSize);
int main(int argc, char *argv[])
{
int p;
int i;
int a[10] = {1,2,3,8,4,0,5,0,6,7};
p = Func(a,10);
for(i = 0; i < 10;i++){
printf("%d\n",a[i]);
}
printf("fzp:%d\n",p);
system("PAUSE");
return 0;
}
int Func(int *a, int nSize)
{
int z,nz; //z跟踪数组中零元素位置,
int i; //nz跟踪非零元素 位置
int flag;
if((a == NULL) || (nSize < 0)){
printf("arg error\n");
return -1;
}
for(i = 0; i < nSize; i++){ //寻找数组中首个0元素的位置
if(a[i] == 0){
z = i; //初始n、nz使得两个for循环都
nz = i; //从首个0元素的位置开始
flag = i;
break;
}
}
while(1){
if(z != nz){ //先进行非零元素查找,第一个
for(; z < nSize; z++){ //零元素之前已找到 ,先跳过
if(a[z] == 0)
break;
}
}
for(; nz < nSize; nz++){
if(a[nz] != 0)
break;
}
a[z] = a[nz];
a[nz] = 0;
if(nz == (nSize - 1)) //nz到达数组尾,整理完毕,跳出
break;
z++;
nz++;
}
return flag;
}
博主C语言退化,欢迎交流改进,谢谢!