一些常见的笔试题(一)

简单算法的实现代码:

// 求N以内的素数 /*! * @brief: 求N以内的素数 * @param: __in int nNum 范围大小 <= nNum * @param: __inout vector<int>& vecReturn 返回所有素数列表 * @return: void */ void GetPrimeNumber(__in int nNum, __inout vector<int>& vecReturn) { vecReturn.clear(); if (nNum <= 1) { return; } // 2 是最小的素数 if (2 == nNum) { vecReturn.push_back(nNum); return; } vecReturn.push_back(2); for (int N = 3; N <= nNum; N += 2) { int k = sqrtl(N); int j = 2; for (; j <= k; ++j) { if (0 == N % j) { break; } } // j > k,说明上面的for循环完全走到,即没有被break掉 if (j > k && N % (k + 1) != 0) { vecReturn.push_back(N); } } } // 判断是否是素数 /*! * @brief: 判断是否是素数 * @param: __in int nNum 待检测的数据 * @return: bool true表示是素数 */ bool IsPrimeNumber(__in int nNum) { assert(nNum > 0); int nTemp = sqrt((float)nNum); int k = 2; for (; k <= nTemp; ++k) { if (0 == nNum % k) { return false; } } if (k > nTemp && nNum % (k + 1) != 0) { return true; } return false; } // 求最大公约数 /*! * @brief: 求最大公约数 * @param: __in int nNum_1 数据1 * @param: __in int nNum_2 数据2 * @return: int 返回最大公约数 */ int GetGCD(__in int nNum_1, __in int nNum_2) { if (nNum_1 == nNum_2) { return nNum_1; } int nDivisor = (nNum_1 > nNum_2) ? nNum_1 : nNum_2; int nDividend = (nNum_1 < nNum_2) ? nNum_1 : nNum_2; bool hasGCD = false; while (true) { int nRt = nDivisor % nDividend ; if (0 == nRt) { hasGCD = true; break; } nDivisor = nDividend; nDividend = nRt; if (nDividend < nDividend) { break; } } return hasGCD ? nDividend : nNum_1 * nNum_2; } // 求最小公倍数 /*! * @brief: 求最大公约数 * @param: __in int nNum_1 数据1 * @param: __in int nNum_2 数据2 * @return: int 返回最小公倍数 */ int GetLCM(__in int nNum_1, __in int nNum_2) { assert(nNum_1 > 0 && nNum_2 > 0); if ( IsPrimeNumber(nNum_1) && IsPrimeNumber(nNum_2) ) { return nNum_1 * nNum_2; } if (0 == nNum_1 % nNum_2) { return nNum_1; } if (0 == nNum_2 % nNum_1) { return nNum_2; } int M = 2; int nBigNum = (nNum_1 > nNum_2) ? nNum_1 : nNum_2; int nSmallNum = (nNum_1 < nNum_2) ? nNum_1 : nNum_2; int nAns = 0; while (true) { nAns = nBigNum * M; if (0 == nAns % nSmallNum) { break; } ++M; } return nAns; } // 将一个N进制数转换成M进制数 /*! * @brief: 将一个N进制数转换成M进制数 * @param: __in int nNum 要转换的数 * @param: __in int N 原进制,N现在指定为10 * @param: __in int M 要转换的进制,现在这里应该<=16 * @param: __inout vector<wchar_t>& vecOut (存放最终显示的数据,以字符串的形式表示出来) * @return: void */ void Convert(__in int nNum, __in int N, __in int M, __inout vector<wchar_t>& vecOut) { assert(nNum > 0 && N > 0 && M > 0); vector<int> vecOutNum; int nTemp = nNum; while (nTemp >= M) { vecOutNum.push_back(nTemp % M); nTemp = nTemp / M; } vecOutNum.push_back(nTemp); wchar_t ch = L'/0'; for (vector<int>::iterator iter = vecOutNum.begin(); iter != vecOutNum.end(); ++iter) { ch = (*iter >= 10) ? (*iter - 10 + L'A') : (*iter + L'0'); vecOut.push_back(ch); } } ////////////////////////////////////////////////////////////////////////// // 题目:找出数组中第k大小的数,输出数所在的位置。 // 假设有数组int arr[] = {2,3,0,6,3}中,则第一大的数是6,位置在3(假设位置下标以0开始)。 // 第二大、第三大的数都是3,位置在1、4随便输出哪一个均可。 // 思路:先将数组排序,然后找出第K大小的数,最后上数组里查找。关键点在排序。这里选择快排 /*! * @brief: 定义qsort(快排)的回调函数,用以比较 * @param: const void * pData1 比较的数据的指针 * @param: const void * pData2 比较的数据的指针 * @return: int 返回比较的大小 */ int CompareData(const void* pData1, const void* pData2) { return ( *((int*)pData1) - *((int*)pData2) ); } /*! * @brief: 找出数组中第k大小的数,输出数所在的位置 * @param: __in const int* pArr 原数组指针 * @param: __in int N 原数组大小 * @param: __in int K 第K大小 * @return: int 返回第K大小的数的位置 */ int FindKthMaxPos(__in const int* pArr, __in int N, __in int K) { assert(NULL == pArr || K < N); int* pArrTemp = new int[N]; if (NULL == pArrTemp) { return -1; } memcpy(pArrTemp, pArr, sizeof(int) * N); qsort(pArrTemp, N, sizeof(int), CompareData); for (int nIx = 0; nIx < N; ++nIx) { if (pArr[nIx] == pArrTemp[K]) { return nIx; } } return -1; } // 求乱序排序的N个数中连续K个数的和的最大值 /*! * @brief: 求乱序排序的N个数中连续K个数的和的最大值 * @param: __in int* pArr 原数组指针 * @param: __in int N 原数组大小 * @param: __in int K 第K大小 * @param: __inout int& nMax 返回和的最大值 * @return: bool 用以说明该函数调用过程中是否成功 */ bool FindMaxValueOfKCount(__in int* pArr, __in int N, __in int K, __inout int& nMax) { if (NULL == pArr || K < 0) { return false; } if (K >= N) { for (int nIx = 0; nIx < N; ++nIx) { nMax += pArr[nIx]; } return true; } int nCurPos = K; int nSum = 0; for (int nIx = 0; nIx < K; ++nIx) { nSum += pArr[nIx]; } nMax = nSum; if (N > 1) { for (int nIx = 1; nIx <= N - K; ++nIx) { nSum = nSum + pArr[nCurPos] - pArr[nCurPos - K]; nMax = nSum > nMax ? nSum : nMax; nCurPos++; } } return true; } // 已知整形数组,找到它的所有子集中元素之和最大的那个子集 /*! * @brief: 已知整形数组,找到它的所有子集中元素之和最大的那个子集 * @param: __in int* pArr 原数组指针 * @param: __in int N 原数组大小 * @param: __inout int& nMax 返回和的最大值 * @param: __inout vector<int> & vecOut 返回子集 * @return: bool 用以说明该函数调用过程中是否成功 */ bool FindMaxValueCollection(__in int* pArr, __in int N, __inout int& nMax, __inout vector<int>& vecOut) { if (NULL == pArr || N < 0) { return false; } vecOut.clear(); int nMaxS = 0; int nMaxE = 0; int nSum = 0; int nNext = 0; nMax = pArr[0]; for (int nIx = 0; nIx < N; ++nIx) { nSum = pArr[nIx]; nNext = nIx + 1; while (nNext < N) { nSum += pArr[nNext]; if (nSum > nMax) { nMax = nSum; nMaxS = nIx; nMaxE = nNext; } nNext++; } } if (nMaxS < N && nMaxE < N && nMaxS < nMaxE) { for (int nIx = nMaxS; nIx <= nMaxE; ++nIx) { vecOut.push_back(pArr[nIx]); } } return true; }

 

测试程序

void _tmain() { ////////////////////////////////////////////////////////////////////////// // ①求N以内的素数--测试 //int nNum = 0; //cin >> nNum; //vector<int> vecPrimeNum; //GetPrimeNumber(nNum, vecPrimeNum); //int nSize = vecPrimeNum.size(); //for (int nIx = 0; nIx < nSize; ++nIx) //{ // cout << vecPrimeNum[nIx] << ", "; //} //cout << endl; ////////////////////////////////////////////////////////////////////////// //// ②求最大公约数 //int nNum_1, nNum_2, nRt; //cin >> nNum_1; //cin >> nNum_2; //nRt = GetGCD(nNum_1, nNum_2); //cout << nRt << endl; ////////////////////////////////////////////////////////////////////////// // 求最小公倍数 //int nNum_1, nNum_2, nRt; //cin >> nNum_1; //cin >> nNum_2; //nRt = GetLCM(nNum_1, nNum_2); //cout << nRt << endl; ////////////////////////////////////////////////////////////////////////// //// ③将一个N进制数转换成M进制数 //int N; //int M; //int nNum; //vector<wchar_t> vecOut; //cout << "original data:/t/t"; cin >> nNum; //cout << "original system:/t"; cin >> N; //cout << "new system:/t/t"; cin >> M; //Convert(nNum, N, M, vecOut); //for (int i = vecOut.size() - 1; i >= 0; --i) //{ // wcout << vecOut.at(i); //} //cout << endl; ////////////////////////////////////////////////////////////////////////// // 找出数组中第k大小的数,输出数所在的位置。 //int arr[] = { 2, 3, 0, 6, 3 }; //FindKthMaxPos(arr, sizeof(arr) / sizeof(int), 2); ////////////////////////////////////////////////////////////////////////// // 求乱序排序的N个数中连续K个数的和的最大值 //int arr[] = {-1, 2, -5, 0, 7, -2, 7}; //int nMax = 0; //int K = 2; //FindMaxValueOfKCount(arr, sizeof(arr) / sizeof(int), K, nMax); ////////////////////////////////////////////////////////////////////////// // 求乱序排序的N个数中连续K个数的和的最大值 //int arr[] = {-12, 12, -3, 54, -42, 4, 5, 7}; //int nMax = 0; //vector<int> vecOut; //FindMaxValueCollection(arr, sizeof(arr) / sizeof(int), nMax, vecOut); }


你可能感兴趣的:(算法,测试,null,iterator,System,float)