题干:
int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至
数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
DoH_Wang (
)发表于:2007-12-19 17:00:16
我不是华为员工,以下是我写的程序,我把有序理解为非0元素在原来数组中的先后顺序。
设计思路:
先找出第一个0元素取得返回值,然后设置两个一前一后的指针将非0元素有序地移至数组前面,最后将剩余的需要置0的空间置0。
#include "stdafx.h"
#include "assert.h"
/*
名称:Func
描述:使数组A中的0移至后面,非0整数移至前面并保持有序
输入参数:数组A,数组长度nSize
输出参数:无
返回值:原数据中第一个元素为0的下标nValue
日期:2007.12.19
备注:数组中如果没有0,返回-1
*/
int Func(int* A, int nSize)
{
assert(A != NULL && nSize > 0);
/*找出第一个0*/
for(int i=0, *p = A, *q, nValue; i < nSize; i++)
if(*p == 0)
{
nValue = i;
q = p;
break;
}
else
p++;
/*没有0*/
if(i > = nSize)
return -1;
/*将非0元素有序地移至前面*/
for(++i; i < nSize; i++)
if(*(++p) != 0)
*q++ = *p;
/*将剩余空间置0*/
int nLeft=nSize - (q - A);
for(i=0; i < nLeft; i++)
*q++ =0;
return nValue;
}
学习写程序的方式,不管算法怎么样,程序应该写得规范,指出程序的功能,算法思想,输入参数类型,输出参数类型,返回值