當前位置:股票大全官網 - 財經新聞 - 各大公司寫試題和答案。

各大公司寫試題和答案。

騰訊試題:const的含義和實現機制

const的含義及其實現機制,如const int i,如何使I可讀?

Const用於指示定義的變量是只讀的。

這是在編譯期間完成的,編譯器可以直接用常數替換對該變量的引用。

閱讀更多信息:

/view/30509.htm

騰訊測試題:統計論壇在線人口分布

要找到壹個論壇的在線人數,假設有壹個擁有2億個註冊ID的論壇,每個ID將在壹個日誌文件中記錄從登錄到退出的登錄時間和退出時間。要求寫壹個算法統計壹天內論壇中用戶的在線分布情況,采樣粒度為秒級。

壹天有3600*24 = 86400秒。

定義壹個長度為86400的整數數組int delta【86400】,每個整數對應這壹秒鐘人數的變化值,可以是正數也可以是負數。開始時將所有數組元素初始化為0。

然後依次讀入每個用戶的登錄時間和退出時間,登錄時間對應的整數值加1,退出時間對應的整數值減1。

經過此處理後,每秒鐘的人數將存儲在數組中。

定義另壹個整數數組int online _ num【86400】,長度為86400,每個整數對應這壹秒的在線人數。

假設壹天開始時論壇的在線人數為0,則第1秒的在線人數_ num【0】= delta【0】。n+1秒中的人數online _ num【n】= online _ num【n-1】+delta【n】。

通過這種方式,我們可以獲得壹天中任何時間的在線人數。

騰訊測試題:從10G的數中求中位數。

壹個文件中有10G個整數,這些整數是無序排列的。要求找到中間值。內存限制為2G。

假設10G整數是64位。

2G內存可存儲256M 64位整數。

我們可以將64位整數空間平均劃分為256M個取值範圍,用2G內存統計每個取值範圍內的整數個數。以這種方式遍歷10G的整數後,我們知道中位數出現在該範圍內,以及有多少個整數出現在該範圍內。

如果中位數的範圍內的整數較少,我們可以對該範圍內的整數進行排序並找到中位數。如果此範圍內有許多整數,我們可以使用相同的方法將此範圍再次劃分為幾個更小的範圍(256M=2^28,因此最多需要三次將此範圍縮小到1,並找到中間值)。

騰訊測試:兩個整數集合A和B,求它們的交集。

求兩個整數集a和b的交集。

1.讀取整數集A中的整數,將讀取的整數插入映射中,並將相應的值設置為1。

2.讀取整數集b中的整數。如果該整數在映射中,並且值為1,則將此數字添加到交叉點並將映射中的相應值更改為2。

通過更改映射中的值,可以避免兩次輸出相同的值。

騰訊測試:找出兩個沒有出現在1到10w中的數字。

從1到10w共有10W個號碼。如何通過移除兩個數字並打亂順序來找到這兩個數字?

申請10w位的空間,每壹位代表壹個數字是否出現過。

開始時,所有10w位都初始化為0,表示所有數字從未出現過。

然後依次讀取已經失序的數字,並將相應的位設置為1。

當處理完所有數字後,根據0位獲得缺失的數字。

首先,計算1到10w的和以及平方和。

然後計算給定數字的總和,即平方和。

將這兩個數字相減,就可以得到這兩個數字的和,即平方和。

所以我們有

x + y = n

x^2 + y^2 = m

解這個方程可以得到x和y的值。

騰訊測試:24小時內需要找到多少只老鼠的毒?

有1000瓶水,其中壹瓶有毒。如果老鼠嘗了壹點有毒的水,24小時後就會死亡。需要多少只老鼠才能在24小時內確定那瓶水有毒?

最容易想到的是用1000只老鼠,每只喝壹瓶。但顯然這不是最好的答案。

因為每只老鼠喝壹瓶酒不是最好的答案,妳應該每只老鼠喝更多的酒。每人應該喝多少瓶?

首先,我們換壹種說法。如果有X只老鼠,妳能在24小時內找到多少瓶水?

因為每只老鼠只有兩種結果:死或活,所以X只老鼠最多可以代表2 x種結果。如果每個結果都對壹瓶水有毒,那麽有毒的壹瓶水可以從2 x瓶水中找到。那麽如何實現這種對應呢?

第壹只老鼠喝瓶子1到2(X-1),第二只老鼠喝瓶子1到2(X-2)和2(X-1)+1到2(X-65433)。

回到這個話題,總有1000瓶水,所以至少需要10只老鼠。

騰訊測試題:根據上排數字填寫下排數字並符合要求。

根據上壹行給出十個數字,並在下壹行填寫相應的十個數字。要求下排的每個數字是上排相應位置的數字在下排出現的次數。上壹行的數字:0,1,2,3,4,5,6,7,8,9。

騰訊測試:判斷數字是否出現在第40億個數字中?

給40億個不重復的無符號int整數,無序的整數,然後再給幾個數字。我們如何快速判斷這些數字是否在那40億個數字中?

回答:

無符號整數的取值範圍是0到2 ^ 32-1。我們可以申請2 32/8 = 512m的連續內存,每壹位對應壹個無符號int數。首先,512M內存被初始化為0,然後每當處理壹個數字時,相應的位被設置為1。當需要查詢時,直接找到相應的位,並查看其值是0還是1。

1.請定義壹個宏來比較兩個數字A和b的大小。不能使用大於、小於或if語句# define Max(A,b)(A/b)?甲:乙

2.如何輸出源文件的標題和當前執行的行數?

int line = _ _ LINE _ _

char * file = _ _ FILE _ _

cout & lt& lt“文件名為“& lt& lt(文件)& lt& lt“,行是“& lt

3.兩個數相乘,小數點後的位數沒有限制。請寫壹個高精度算法。

4.編寫病毒

while(1)

{

int * p = new int【1000000】;

}

5.在不使用額外空間的情況下,A和B鏈表的元素被合並。

6.序列化樹並將其存儲在數組或鏈表中。

結構st{

int I;

短s;

char c;

};

sizeof(struct ST);

7、

char * p 1;

void * p2

int p3

char P4【10】;

sizeof(p 1...p4)?

8、

4,4,4,10

二進位檢索

快速排序

刪除雙向鏈表的節點

面試基本都是和項目有關的,當場輸出幾個程序性問題,不能用草稿紙。

微軟測試:寫壹個程序找出二叉樹的深度

樹的深度等於max(左子樹深度,右子樹深度)+1。可以使用遞歸實現。

假設節點被定義為

1 . struct節點{

2.節點*左側;

3.Node * right

4.};

5 . int get depth(Node * root ){

6 . if(NULL = = root ){

7 .返回0;

8.}

9 . int left _ depth = get depth(root-& gt;左);

10 . int right _ depth = get depth(root-& gt;對);

11 . return left _ depth & gt;右_深度?left _ depth+1:right _ depth+1;

12.}

微軟試卷:用平衡重將140克鹽分成50克和90克三份?

有壹個天平,壹個2克的砝碼和壹個7克的砝碼。如何用平衡重分三次將140克鹽分成50,90克?

第壹種方法:

第壹次:稱7+2g鹽(相當於2、7、9三個重量)。

第二次:稱2+7+9 = 18g鹽(相當於2,7,9,18的四倍重量)。

第三次:稱7+18=x+2,x為23,23+9+18 = 50g鹽。

剩下的是90克。

第二種方法:

1.首先,將140克鹽分成兩份,每份70克。

2.將70克分成兩份,每份35克。

3.然後在天平的兩邊放上兩個砝碼,將35g面粉分成兩份放在兩邊(15+7=20+2)。

現在有四堆面粉70,35,15,20,分別組合在壹起。

70+20=90

35+15=50

微軟測試:地球上有多少個點符合這樣的條件?

站在地球上的某壹點,向南走壹公裏,然後向東走壹公裏,最後向北走壹公裏,回到原點。地球上有多少個點符合這個條件?

北極符合這個條件。

在靠近南極的壹個圓圈中也滿足這壹條件。在這個圓上,向南走壹公裏,然後向東走壹公裏,剛好繞過南極,再向北走壹公裏回到原點。

所以地球上有無數個點符合這個條件。

或者

首先,在地球表面上,南北方向是沿著經度方向,東西方向是沿著緯度方向。如果妳壹直向北走,妳將到達北極,如果妳向南走,妳將到達南極。因此,向南走壹公裏,然後向東走壹公裏,最後向北走壹公裏,回到原點。在壹種情況下,起點在北極,所以向南走壹公裏,然後向東走幾公裏,最後向北走壹公裏,最後返回北極;

其次,可以認為如果從A點到B點向南走壹公裏,那麽如果向東走壹公裏,就可以回到B點,然後最後向北走壹公裏,就可以回到原點A .這樣,我們可以先找到壹個圍繞南北極只有1公裏的圓,所以當這個圓落在南極附近時,我們只需要向北推1公裏,這個圓上的所有點此時都可以滿足;如果這個圓落在北極附近,我就不分析是否可以向北推1 km。無論如何,如果妳能在南極附近找到任意數量的點,妳就可以回到這個問題。

微軟試卷:正確標記水果籃

有三個水果籃。其中壹個只有蘋果,壹個只有橘子,另壹個蘋果和橘子都有。每個水果籃上都有標簽,但標簽都是錯的。如何檢查果籃中的水果並正確標記每個果籃?

檢查其中壹個標有蘋果和橘子的果籃。

如果是橘子,這個籃子裏只有橘子;標有橙子的果籃裏只有蘋果;標有蘋果的果籃裏既有蘋果也有橘子。

如果是蘋果,這個籃子裏只有蘋果;標有蘋果的果籃裏只有橘子;標有橙子的果籃裏有蘋果和橙子。

微軟筆測試:畫壹個沒有浮點運算的圓

在屏幕上畫壹個沒有浮點運算的圓(x**2+y**2 = r**2,其中r為正整數)。

考慮到圓的對稱性,我們只需要考慮第壹象限。

相當於找到壹條從連接點(0,r)到點(r,0)的曲線,曲線上的點最接近圓心(0,0)。

我們可以從點(0,r)開始,搜索三個點到圓心的距離:右(1,r)、下(0,r-1)和右下(1,r-1),並選擇最接近圓心的點作為下壹個點。重復該操作直到到達點(r,0)。

因為不能使用浮點運算,所以只能根據距離的平方來比較距離。那就是比較x**2+y**2和r**2的區別。

微軟測試:將壹個句子的單詞順序顛倒。

把壹個句子的詞序顛倒。例如,“hi baidu com mianshiti”以相反的順序更改為“mianshiti com baidu hi”。

可以分為兩步:

第壹步是以相反的順序找到字母,“hi baidu com mianshiti”變成了“itihsnaim moc udiab ih”。

在第二部分中,每個單詞中的字母都被顛倒,並將“itihsnaim moc udiab ih”更改為“mianshiti com baidu hi”。

這種方法可以在原始字符串上進行,只需要幾個整數變量來保持指針,空間復雜度較低。

微軟測試:計算n位整數中有多少位是1。

設這個整數為x。

方法1:

讓這個整數除以2。如果余數是1,則表示最後壹位數字是1,統計值加上1。

對除法結果執行上述操作,直到結果為0。

方法二:

考慮到除法的高復雜度,可以用移位運算代替除法。

對x & amp 1(x & amp;1),如果結果為1,則表示最後壹位數字為1,統計值為正1。

將x向右轉壹位(x》& gt;1),重復上述過程,直到移位後的結果為0。

方法三:

如果需要計算大量的數字,並且內存足夠大,可以考慮將每個數字對應的位數記錄為1,這樣每次計算都只是壹次搜索操作。

1 . int n = 0;當(x)

2.{

3.xx = x & amp(x-1);

4 . n++;

5.}

6 . return n;

微軟測試問題:快速找到整數的7倍

乘法相對較慢,因此快速的方法是將此乘法轉換為加法、減法和移位運算。

您可以將該整數向左移動三位數(×8),然後減去原始值:x

微軟測試:判斷壹個數是否是2的n次方。

設要判斷的數是壹個無符號整數x。

首先判斷x是否為0,如果為0則不是2的n次方,返回。

X和X-1按位進行and運算。如果結果為0,則意味著該數字是2的n次方。如果結果不是0,則意味著這個數字不是2的n次方。

證明:

如果是2的n次方,這個數用二進制表示時只有壹位是1,其他都是0。減去1後,此位變為0,後面的位變為1,因此按位and的結果為0。

如果它不是2的n次方,那麽當這個數用二進制表示時,有許多位是1。減去1後,只有最後壹個1變成0,而前面的1仍然是1,因此按位求和的結果不是0。

三只螞蟻不碰撞的概率是多少?

三角形的三個頂點上各有壹只螞蟻。它們移動到另壹個頂點,目標是隨機的(它可能是其他兩個頂點中的任何壹個)。三只螞蟻不碰撞的概率是多少?

如果螞蟻順時針爬行,則記錄為0,螞蟻逆時針爬行為1。那麽三只螞蟻的狀態可以是000、001,...,110,11,並且每個狀態的概率相等。在這八種狀態中,只有000和111可以避免碰撞,因此螞蟻不碰撞的概率為1/4。

Microsoft測試:判斷數組是否包含重復的數字。

給定壹個長度為n的數組,每個元素的取值範圍是1到n .確定數組中是否有重復的數字。(不需要保留原始數組)

給定壹個長度為n的數組,每個元素的取值範圍是1到n .確定數組中是否有重復的數字。(不需要保留原始數組)

微軟測試:如何把蛋糕切成兩份

有壹個長方形小孔的長方形蛋糕(任何角度都可以)。如何用直刀把蛋糕切成相等的兩份?

任何通過矩形中心的直線都可以平分矩形,因此連接兩個矩形中心點的直線可以平分蛋糕。

壹個無序列表,如list = {a,l,x,b,e,f,f,e,a,g,h,b,m},請刪除重復項並保持原始順序。上面的列表是刪除重復項後的新列表= {a,l,x,b,e,f,g。

創建壹個hash_map,其中key是鏈表中已經遍歷過的節點的內容,開頭為空。

從頭開始遍歷鏈表中的節點:

-如果hash_map中已經存在節點內容,則刪除此節點並繼續向後遍歷;

-如果節點內容不在hash_map中,則保留該節點,將節點內容添加到hash_map中,並繼續向後遍歷。

微軟測試:小明壹家五口如何過橋?

小明家過橋,過橋時天很黑,所以必須有燈。現在小明過橋需要1秒,小明哥哥需要3秒,小明爸爸需要6秒,小明媽媽需要8秒,小明爺爺需要12秒。壹次最多兩個人可以過橋,過橋的速度取決於最慢的那個人,燈亮30秒後就會熄滅。問:小明壹家是怎麽過橋的?

小明和弟弟過去了小明回來了,用的是4s;

媽媽和爺爺過去了,哥哥回來了,用的是15s;;

小明和弟弟過去了小明回來了,用的是4s;

小明和他爸爸用的是6s;

總共需要29s。

題目的關鍵是讓速度相近的人走在壹起,以免太拖累快壹點的人。

微軟測試問題:寫壹個程序找出素數的和

寫壹個程序求素數的和,例如f(7)= 2+3+5+7+11+13+17 = 58。

方法1:

對於從2開始遞增的整數n,請執行以下操作:

依次將n除以【2,n-1】中的數。如果余數為0,則意味著n不是素數。如果所有余數都不為0,則表示n是壹個質數,並將其相加。

空間復雜度為O(1),時間復雜度為O(n ^ 2),其中n是要查找的最大素數(示例的對應值為17)。

方法二:

妳可以維護壹個質數序列,所以當妳需要判斷壹個數是否是質數時,妳只需要判斷它是否能被壹個比自己小的質數整除。

對於從2開始遞增的整數n,請執行以下操作:

在【2,n-1】中將n除以素數(2,3,5,7,此序列開頭為空),如果余數為0,則表示n不是素數;如果所有的余數都不為0,則意味著n是壹個素數。將這個質數加入質數序列並相加。

空間復雜度為O(m),時間復雜度為O(Mn),其中m是素數的個數(示例的對應值為7),n是要查找的最大素數值(示例的對應值為17)。

方法三:

妳也可以用加法代替除法。

申請壹個足夠大的空間,每個位對應壹個整數,並開始將所有位初始化為0。

對於壹個已知的質數(開頭只有2個),將這個質數的所有倍數所對應的位數改為1,那麽0值最小的位數所對應的數就是壹個質數。還標記了新獲得的素數的倍數。

通過累加以這種方式獲得的素數序列可以獲得素數的和。

空間復雜度為O(n),時間響應為O(n),其中n是要查找的最大素數值(示例的對應值為17)。