笔试编程题一道

如有错误请及时留言,我好及时修改避免误导更多人,谢谢!

一道华为编程题目,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语言退化,欢迎交流改进,谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值