#面试题#

来源:互联网 发布:2017淘宝店铺复核认证 编辑:程序博客网 时间:2024/06/05 04:28

1,将两个数组按升序合并,并过滤掉重复数组元素

void Array(int* InputArray1, int InputNum1, int* InputArray2, int InputNum2, int** OutPutArray, int* OutputNum){int *R = new int[InputNum1 + InputNum2 + 1];int num = InputNum1 + InputNum2;int temp;int *R1 = new int[InputNum1 + InputNum2 + 1];int flag = 0;int count = 0;//合并到一个数组里面for (int i = 0; i < InputNum1 + InputNum2; i++){if (i < InputNum1){R[i] = InputArray1[i];}elseR[i] = InputArray2[i - (InputNum1)];}//数组进行排序for (int i = 0; i < InputNum1 + InputNum2; i++){for (int j = 0; j < InputNum1 + InputNum2 - i - 1; j++){if (R[j] > R[j + 1]){temp = R[j];R[j] = R[j + 1];R[j + 1] = R[j];}}}for (int i = 0; i < num; i++)cout << R[i];cout << endl;//重复数组元素进行删除for (int i = 0; i < InputNum1 + InputNum2 - 1; i++){if (R[i + 1] == R[i]){R1[flag] = i + 1;flag++;}}*OutPutArray = new int[InputNum1 + InputNum2 + 1];for (int i = 0,j = 0; i < InputNum1 + InputNum2 ; i++){if (R1[count] != i){(*OutPutArray)[j] = R[i];j++;}elsecount++;}*OutputNum = InputNum1 + InputNum2 - flag;}int _tmain(int argc, _TCHAR* argv[]){int a1[] = {1,2,2,5,1};int a2[] = {1,2,3,4,5};int* a3 = NULL;int num = 0;Array(a1, 5, a2, 5, &a3, &num);for (int i = 0; i < num; i++){cout << a3[i] << " ";}cout << endl;system("pause");return 0;}


当时第一次做的时候,大致的思路是对的,分三步去实现整个函数功能,因为是手写,忽略了以下几点细节,希望能够引以为戒

1. 申请动态内存

   数组: int *Array = new int [ Size ] ;

       char* String = new char[ Size ] ;

2. 对作为二维数组的形参的操作

    例如:

void Array(int* InputArray1, int InputNum1, int* InputArray2, int InputNum2, int** OutPutArray, int* OutputNum)
我当时在纸上写的对二级指针的操作是:*OutPutArray[j] = R[i]; //这里少了一个括号 (*OutPutArray)[j] = R[i];导致我在编译器中一直出现内存读写错误,
编译器把它理解成 *(OutPutArray[j]) = R[i];

以上是我事后反思自己当时纸写代码时出现的问题,几个小细节没有注意到,希望能有帮助

原创粉丝点击