廣州4399面試題(一)
廣州4399面試題(一)
By 馬冬亮(凝霜 Loki)
一個人的戰爭(http://blog.csdn.net/MDL13412)
題目描述
現給定一個含有n個元素的陣列,請隨機獲取其中的m個元素(不能重複獲取)。
演算法描述
首先,隨機獲取元素,可以使用rand() % 陣列長度;
其次,要保證元素的不重複獲取,只需將獲取的元素從原陣列中移除即可,但是每次都進行刪除操作,需要頻繁的移動陣列元素,其複雜度很高;現在,我們換一種思路,將獲取的元素與原陣列最後的元素進行交換,再將陣列的長度減一,那麼就可以做到O(1)複雜度將其移除;詳見下圖:
此演算法的時間複雜度為O(n),其只與要獲取的m個數有關,在n和m相差非常懸殊的時候,效率非常高。
程式原始碼
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
typedef int ErrorType;
const ErrorType ErrSucceed = 0;
const ErrorType ErrInvalidRange = 10;
const ErrorType ErrUnknown = 100;
template <typename ItemType>
ErrorType GetRandItemsFromArray(vector<ItemType> &items,
const size_t itemCount,
vector<ItemType> &result)
{
// 邊界檢測
if (items.size() < itemCount)
return ErrInvalidRange;
// 將結果向量清空,並預留足夠的空間,防止多次分配導致的效能開銷。
result.clear();
result.reserve(itemCount);
// 注意差1的邊界錯誤
size_t itemsLength = items.size() - 1;
// 演算法描述見正文
for (size_t i = 0; i < itemCount; ++i)
{
int tmpIndex = rand() % itemsLength;
result.push_back(items[tmpIndex]);
swap(items[tmpIndex], items[itemsLength]);
--itemsLength;
}
return ErrSucceed;
}
int main()
{
vector<int> vec;
for (int i = 0; i < 100; ++i)
vec.push_back(i);
vector<int> res;
for (int i = 0; i < 10; ++i)
{
GetRandItemsFromArray(vec, 10, res);
copy(res.begin(), res.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
return 0;
}
總結
題目本身不難,但是要注意邊界的校驗,錯誤處理,程式碼可讀性,資料抽象,時間及空間複雜度。另外,如果是現場寫程式碼,最好問面試官原始陣列是否允許修改!
相關文章
- 【面試攻略】C++面試-4399面試C++
- 我在廣州面試的那些事面試
- 廣州,3年Web面試總結Web面試
- 廣州南沙軟體園面試試題及答案(C++部分) (轉)面試C++
- 廣州南沙軟體園面試試題及答案(VB、ASP部分) (轉)面試
- 廣州某小公司:ThreadLocal面試thread面試
- 中山大學自主招生面試題:假如廣州停電5分鐘面試題
- Java面試題(一)Java面試題
- 面試題系列一面試題
- 4399財報:2014年Q4 4399營收7.86億元營收
- 面試題隨記一面試題
- python面試題(一)Python面試題
- 前端面試題一前端面試題
- 一個Promise面試題Promise面試題
- 阿里面試題(一)阿里面試題
- iOS 面試題整理(一)iOS面試題
- 一道面試題面試題
- 一家外企的面試題目(C/C++面試題,C語言面試題)面試題C++C語言
- Hive的一個面試題Hive面試題
- 梳理一波面試題面試題
- 面試題(一)北京巨集林面試題
- JAVA面試題合集——精髓(一)Java面試題
- Swift面試題總結(一)Swift面試題
- Web前端JQuery面試題(一)Web前端jQuery面試題
- iOS面試題總結(一)iOS面試題
- java面試題核心篇(一)Java面試題
- Java常考面試題(一)Java面試題
- Java面試題彙總(一)Java面試題
- mysql一道面試題MySql面試題
- 華為面試其中一題面試
- 演算法面試題:一演算法面試題
- 記一次面試試題(一)面試
- 最近去騰訊面試了,分享一波面試題面試題
- Java面試題-基礎篇一Java面試題
- 【理解】一道 JS 面試題JS面試題
- PHP引用的一個面試題PHP面試題
- 記錄一次面試題面試題
- 一道面試題的分析面試題