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)。