日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

腾讯实习笔试:关于几个有序数组求交集的问题

發布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 腾讯实习笔试:关于几个有序数组求交集的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目就是假設有三個有序數組對其求交集,要求算法空間復雜度必須小,有序數組量會比較大。
解法:
第一種就是用二分法查找,二分法查找的效率是log(n),兩個數組求交集就是n1log(n2),當n1遠小于n2的時候,這個算法效果可以
第二種就是遍歷,用兩個游標來實現,具體可以見代碼,算法效率o(n1+n2)線性,當n1和n2比較接近時效果可以

#include<iostream> #include<cstdlib> #include<vector> #include<list> #include<algorithm> #include<ctime>using std::vector; using std::list;//獲取一個大小為num,有序的數組vecInt,數組中最大的數值為 max*num void getRandOrderIntVec(vector<int>& vecInt, int num,int max) {vecInt.clear();vecInt.reserve(num);while (vecInt.size() < num){if (vecInt.empty()){int value = (std::rand() % (max));vecInt.push_back(value);}else {int value = (std::rand() % max ) + vecInt.back() + 1;vecInt.push_back(value);}}}//********************遍歷法查找相同的數據********************************** //找出三個數組中相同的數值,并且保存在vecSame的vector中 void getSameValue(vector<int>& vec1, vector<int>& vec2, vector<int>& vec3, vector<int>& vecSame) {vecSame.clear();//先確定一個保存交集的空間大小int minNumInThreeVec = vec1.size();if (vec2.size() < minNumInThreeVec){minNumInThreeVec = vec2.size();}if (vec3.size() < minNumInThreeVec){minNumInThreeVec = vec3.size();}minNumInThreeVec /= 2; vecSame.reserve(minNumInThreeVec);//***********************查找交集**************************vector<int>::iterator vecIter1 = vec1.begin();vector<int>::iterator vecIter2 = vec2.begin();vector<int>::iterator vecIter3 = vec3.begin();while ((vecIter1 != vec1.end())& (vecIter2 != vec2.end())& (vecIter3 != vec3.end())){//如果相等的話if (((*vecIter1) == (*vecIter2))& ((*vecIter2) == (*vecIter3))){vecSame.push_back(*vecIter1);//記錄這個數值//將三個迭代器都后移if ((vecIter1 != vec1.end())& (vecIter2 != vec2.end())& (vecIter3 != vec3.end())){vecIter1++;vecIter2++;vecIter3++;}else{return; //有迭代器到最后了}}//如果不相等的話,將最小數值的迭代器后移else{int caseValue = 0;int minValue = (*vecIter1);if (minValue > (*vecIter2)){minValue = (*vecIter2);caseValue = 1;}if (minValue > (*vecIter3)){caseValue = 2;}//后移指向數據最小的迭代器switch (caseValue){case 0:{if (vecIter1 != vec1.end()){vecIter1++;break;}else{return;}}case 1:{if (vecIter2 != vec2.end()){vecIter2++;break;}else{return;}}case 2:{if (vecIter3 != vec3.end()){vecIter3++;break;}else{return;}}default:break;}}} }//***********************二分法查找相同的數據*************************void getSameValueByBinarySeach3(vector<int>& vec1, vector<int>& vec2, vector<int>& vec3, vector<int>& vecSame) {vecSame.clear();//先確定一個保存交集的空間大小int minNumInThreeVec = vec1.size();if (vec2.size() < minNumInThreeVec){minNumInThreeVec = vec2.size();}if (vec3.size() < minNumInThreeVec){minNumInThreeVec = vec3.size();}minNumInThreeVec /= 2;vecSame.reserve(minNumInThreeVec);//這里直接假設vec1是最小的集合,vec2第二小,vec3最大vector<int>::iterator pos2Iter = vec2.end(); vector<int>::iterator pos3Iter = vec3.end();for (int i = (vec1.size()-1); i >= 0; i--){pos2Iter = std::lower_bound(vec2.begin(), pos2Iter, vec1[i]); //縮小二分查找的范圍if ((*pos2Iter) == vec1[i]){pos3Iter = std::lower_bound(vec3.begin(), pos3Iter, vec1[i]);//縮小二分查找的范圍if ((*pos3Iter) == vec1[i]){vecSame.push_back(vec1[i]);}}} }void getSameValueByBinarySeach2(vector<int>& vec1, vector<int>& vec2, vector<int>& vec3, vector<int>& vecSame) {vecSame.clear();//先確定一個保存交集的空間大小int minNumInThreeVec = vec1.size();if (vec2.size() < minNumInThreeVec){minNumInThreeVec = vec2.size();}if (vec3.size() < minNumInThreeVec){minNumInThreeVec = vec3.size();}minNumInThreeVec /= 2;vecSame.reserve(minNumInThreeVec);//這里直接假設vec1是最小的集合,vec2第二小,vec3最大vector<int>::iterator pos2Iter= std::lower_bound(vec2.begin(), vec2.end(), vec1.back()); //縮小二分查找的范圍vector<int>::iterator pos3Iter = std::lower_bound(vec3.begin(), vec3.end(), vec1.back());for (int i = 0; i < vec1.size(); i++){if (std::binary_search(vec2.begin(), pos2Iter, vec1[i])){if (std::binary_search(vec3.begin(), pos3Iter, vec1[i])){vecSame.push_back(vec1[i]);}}} }void getSameValueByBinarySeach(vector<int>& vec1, vector<int>& vec2, vector<int>& vec3, vector<int>& vecSame) {vecSame.clear();//先確定一個保存交集的空間大小int minNumInThreeVec = vec1.size();if (vec2.size() < minNumInThreeVec){minNumInThreeVec = vec2.size();}if (vec3.size() < minNumInThreeVec){minNumInThreeVec = vec3.size();}minNumInThreeVec /= 2;vecSame.reserve(minNumInThreeVec);//這里直接假設vec1是最小的集合,vec2第二小,vec3最大for (int i = 0; i < vec1.size(); i++){if (std::binary_search(vec2.begin(), vec2.end(), vec1[i])){if (std::binary_search(vec3.begin(), vec3.end(), vec1[i])){vecSame.push_back(vec1[i]);}}} }void printVec(vector<int>& vec) {for (int i = 0; i < vec.size(); i++){std::cout << vec[i] << " ";}std::cout << std::endl; }bool ifTwoVecSame(vector<int>& vec1, vector<int>& vec2) {if (vec1.size() != vec2.size()){return false;}for (int i = 0; i < vec1.size(); i++){if (vec1[i] != vec2[i]){return false;}}return true; } int main() {vector<int> vec1;vector<int> vec2;vector<int> vec3;getRandOrderIntVec(vec1, 300000,100);getRandOrderIntVec(vec2, 50000000,60);getRandOrderIntVec(vec3, 100000000,60);//printVec(vec1);//printVec(vec2);//printVec(vec3);//****遍歷法求交*************std::cout << "遍歷法求交集" <<std::endl;vector<int> sameVec;clock_t startTime, endTime;startTime = clock();getSameValue(vec1, vec2, vec3,sameVec);endTime = clock();std::cout << "遍歷法運行時間 " << (endTime - startTime) <<std::endl;//printVec(sameVec);std::cout << "交集數目 :" << sameVec.size() << std::endl;//***********二分法求交***************std::cout << "二分法求交集" << std::endl;vector<int> sameVec2;clock_t startTime2, endTime2;startTime2 = clock();getSameValueByBinarySeach(vec1, vec2, vec3, sameVec2);endTime2 = clock();std::cout << "二分法運行時間 " << (endTime2 - startTime2) << std::endl;//printVec(sameVec2);std::cout << "交集數目 :" << sameVec2.size() << std::endl;//****遍歷法和二分法結果比較*****************std::cout << "兩種方法結果相同1,不同 0: " << ifTwoVecSame(sameVec, sameVec2) << std::endl;//***********二分法求交3***************std::cout << "二分法求交集3" << std::endl;vector<int> sameVec3;clock_t startTime3, endTime3;startTime3 = clock();getSameValueByBinarySeach3(vec1, vec2, vec3, sameVec3);endTime3 = clock();std::cout << "二分法運行時間3 " << (endTime3 - startTime3) << std::endl;//printVec(sameVec2);std::cout << "交集數目3 :" << sameVec3.size() << std::endl;//****遍歷法和二分法結果比較*****************std::cout << "兩種方法結果相同1,不同 0: " << ifTwoVecSame(sameVec, sameVec3) << std::endl; }

總結

以上是生活随笔為你收集整理的腾讯实习笔试:关于几个有序数组求交集的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。