某软件研发笔试题 – 0的移动

 

题目:

int a[nSize],其中隐藏着若干0,其余非0整数,写一个函数

int Func(int *a, int nSize);

使a把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)

 

 

解:

思路1:不知道这里的有序是什么个意思。是按照大小有序,还是按原来先后顺序有序。如果是原来先后顺序有序的话。只需要一次遍历,将为0的元素填充为后面第一个不为0 的元素,然后将不为0的元素置0即可。

int Func(int *a, int nSize){ assert(a != Null && nSize > 0); int index; int i, j; i = 0; j = 0; while (i < nSize && a[i] != 0 ) ++i; if ( i >= nSize) return -1;//没有0 else{ index = i; j = i + 1; } while(i < nSize && j < nSize){ // 寻找0元素 while (i < nSize && a[i] != 0 ) ++i; // 找i位置后第一个不是0的元素 while (j < nSize && a[j] == 0 ) ++j; if (i < nSize && j < nSize){ a[i++] = a[j]; a[j++] = 0; } } return index; } 

思路2:借用快速排序思想,设两指针low和high,分别指向数组头和尾。low指针从前往后扫描为0的元素,high指针从后往前扫描不为0的元素然后交换,当low

int Func(int *a, int nSize){ // 将零元素移到数组尾部 int low = 0; int high = nSize - 1; int firstIndex; bool isFirst = true; while (low <= high){ while (low <= high && a[high] == 0) --high; while (low <= high && a[low] != 0) ++low; if (isFirst) { firstIndex = low; isFirst = false; } if (low <= high){ a[low] = a[high]; a[high] = 0; } } // 将前面的非零元素排序 int dk = nSize / 2; int t; while(dk >= 1){ for (int i = dk; i <= high; ++i){ if (a[i] < a[i-dk]){ t = a[i]; for (int j = i - dk; j >=0 && t < a[j]; j -= dk) a[j+dk] = a[j]; a[j+dk] = t; }//if }//for dk /= 2; }//while return firstIndex; } 

 

你可能感兴趣的:(算法)