您的位置:首页 > 职场人生

面试编程题---其中隐藏着若干0,其余非0整数,使A把0移至后面,非0整数移至数组前面并保持有序

2016-07-06 14:47 429 查看
题目:int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路) 

这是今天看到的一到面试编程题,题目算是简单一些,读完题目至少在思路还编码上还是比较有把握的,不借助辅助空间这一点没问题,考虑效率这个就要用到一个巧字了,一般这个我是想不到的,所以这次我先尝试自己把代码写出来然后看看人家是怎么写的,对比着看,这样可以修炼提升自己的内力!

我自己编的测试程序:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int Func(int * A, int nSize);
int Swap(int* a, int* b);
int InsertSort(int * array, int size);

int main(void)
{
int i;
int A[13] = {4, 1, 0, 6, 0, 9, 2, 0, 0, 3, 8, 5, 7};
//int A1[13] = {0, 1, 0, 6, 0, 9, 2, 0, 0, 3, 0, 0, 0};
int pos = -1;

printf("A[]: ");
for(i = 0; i < 13; i++)
{
printf(" %d, ", A[i]);
}
printf("\n");

pos = Func(A, 13);

printf("A[]: ");
for(i = 0; i < 13; i++)
{
printf(" %d, ", A[i]);
}
printf("\n");

printf("pos = %d\n", pos);

system("pause");
return 0;
}

int Func(int * A, int nSize)
{
int ret = -1;
int i = 0; /* 表示第一个元素的下标 */
int j = nSize - 1; /* 表示最后一个元素的下标 */
static flag = 1;

ret = (A != NULL) && (nSize > 0);

if(ret)
{
//1. 首先判断第一个元素是否为0
while(A[i] == 0)
{
ret = i;
Swap(&A[i], &A[j--]);//交换a[i] a[j]的值 直到a[0]位置不为0
}

while( i != j)//第一个元素不为0
{
i++;
if(A[i] == 0)
{
if(flag == 1)//标记第一次出现0的位置
{
ret = i;
flag = 0;
}
//如果下一个元素为0则先交换
while(A[i] == 0)
{
Swap(&A[i], &A[j--]);//交换a[i] a[j]的值 直到a[0]位置不为0
}
}

InsertSort(A, i+1);//对前面的数字进行插入排序

}
}

return ret;
}

int InsertSort(int * a, int size)
{
int ret = -1;
int i = 0, j = 0;
int Temp = 0;

ret = (a != NULL) && (size > 0);

if(ret)
{
//插入排序
for(i = 1; i < size; i++)
{
if( a[i-1] > a[i] )
{
Temp = a[i];

for(j = i - 1; (j >= 0) && (Temp < a[j]); j-- )
{
a[j+1] = a[j];//向后挪
}

a[j+1] = Temp;
}

}
}

return ret;
}

int Swap(int* a, int* b)
{
int ret = -1;
int c = 0;
ret = (a != NULL) && (b != NULL);

if(ret)
{
c = *a;
*a = *b;
*b = c;
}

return ret;
}


运行效果截图:



上面的编程思路完全是满足题目要求,不过总觉得效率问题总有点欠缺!比如排序用的是插入排序,那个地方绝对可以做个优化!

刚看了别人写的!居然不用排序!题目中保持有序也不知道到底用不用排序!难道是我理解错了???而且用的插入排序也是稳定排序!算是复习了下插入排序吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序 算法 c 面试题