久久综合九色综合97婷婷-美女视频黄频a免费-精品日本一区二区三区在线观看-日韩中文无码有码免费视频-亚洲中文字幕无码专区-扒开双腿疯狂进出爽爽爽动态照片-国产乱理伦片在线观看夜-高清极品美女毛茸茸-欧美寡妇性猛交XXX-国产亚洲精品99在线播放-日韩美女毛片又爽又大毛片,99久久久无码国产精品9,国产成a人片在线观看视频下载,欧美疯狂xxxx吞精视频

有趣生活

當(dāng)前位置:首頁(yè)>職場(chǎng)>常用面試算法解法(巧用bitmap算法解開(kāi)騰訊面試題)

常用面試算法解法(巧用bitmap算法解開(kāi)騰訊面試題)

發(fā)布時(shí)間:2024-01-24閱讀(13)

導(dǎo)讀最近有讀者提問(wèn):聽(tīng)說(shuō)騰訊QQ號(hào)碼的理論最大值是43億左右,那么用完后會(huì)怎樣呢?今天,來(lái)聊一聊與騰訊QQ號(hào)碼相關(guān)的三個(gè)問(wèn)題,相信大家會(huì)有一個(gè)比較完整的認(rèn)識(shí)。Q....

最近有讀者提問(wèn):聽(tīng)說(shuō)騰訊QQ號(hào)碼的理論最大值是43億左右,那么用完后會(huì)怎樣呢?

今天,來(lái)聊一聊與騰訊QQ號(hào)碼相關(guān)的三個(gè)問(wèn)題,相信大家會(huì)有一個(gè)比較完整的認(rèn)識(shí)。

  • QQ號(hào)的范圍是多少?
  • QQ號(hào)用完后會(huì)怎樣?
  • QQ號(hào)和bitmap淵源?

關(guān)于第一個(gè)問(wèn)題,看完如下的有趣動(dòng)圖之后,肯定就會(huì)知道QQ號(hào)的最小值和最大值。

常用面試算法解法(巧用bitmap算法解開(kāi)騰訊面試題)(1)

一. QQ號(hào)的范圍是多少?

相信多數(shù)朋友都用過(guò)QQ,不過(guò)估計(jì)有些人很久沒(méi)登錄過(guò)了。你還記得自己的QQ號(hào)碼嗎?你知道QQ號(hào)碼有多少位數(shù)嗎?你知道QQ號(hào)碼的大小范圍嗎?

別著急,我們會(huì)一一來(lái)解答。大家的微信號(hào)是字符串形式的,帶有一些數(shù)字和字母,但QQ號(hào)是純數(shù)字。在騰訊QQ后臺(tái)的程序中,經(jīng)??吹竭@樣的代碼:

unsigned int uin = getFromCookie(cookie, "uin") ;if ( uin < 10001 ){ log.Error("invalid uin %u", uin) ; return INVALID_UIN ;}

從這段簡(jiǎn)單的代碼中,我們可以看出很多端倪。其中uin指代的就是QQ號(hào)碼,有人說(shuō)uin是unsigned int的縮寫(xiě),有人說(shuō)是user ID number的縮寫(xiě)。

不管怎樣,uin表示的就是QQ號(hào)碼,且是unsigned int類(lèi)型,故QQ號(hào)就是4字節(jié)無(wú)符號(hào)整數(shù),共32bit, 也就是說(shuō),QQ號(hào)的取值范圍是:[0, 2^32 - 1]

然而,這只是理論情況,從上面代碼的判斷可知,QQ號(hào)碼的最小值是10001, 為什么騰訊要做這種限制呢?其實(shí)沒(méi)有為什么,僅僅是早期的一個(gè)設(shè)定而已。

對(duì)于QQ號(hào)碼而言,從10001開(kāi)始,號(hào)越小,就大致表明申請(qǐng)時(shí)間越早,是一個(gè)尊貴號(hào)。那么,10001是誰(shuí)的QQ號(hào)呢?很容易猜,不過(guò)他實(shí)際不用這個(gè)號(hào)。

2^32 - 1 的值是4294967295, 是一個(gè)10位的整數(shù),大約是43億,這就是QQ號(hào)碼的理論最大值,你肯定沒(méi)有見(jiàn)過(guò)11位的QQ號(hào),至少目前是不可能存在的。

到目前為止,大家肯定就能理解下圖中的數(shù)字含義了。在后續(xù)面試騰訊時(shí),如果再問(wèn)到QQ號(hào)碼相關(guān)的問(wèn)題,一定要意識(shí)到QQ號(hào)碼的大小范圍,會(huì)有幫助的。

常用面試算法解法(巧用bitmap算法解開(kāi)騰訊面試題)(2)

二. QQ號(hào)用完后會(huì)怎樣?

既然QQ號(hào)碼的值是有范圍的,那么自然有疑問(wèn):如果這么多QQ號(hào)碼都被申請(qǐng)完后,結(jié)果會(huì)怎樣呢?這是一個(gè)有趣的問(wèn)題,但別替騰訊擔(dān)心這些根本問(wèn)題。

對(duì)于很多互聯(lián)網(wǎng)公司而言,賬號(hào)體系就是生命線,對(duì)騰訊尤其如此。最近幾年,微信的勢(shì)頭超過(guò)QQ, QQ的月活遠(yuǎn)低于10億,注冊(cè)了的QQ也遠(yuǎn)小于43億個(gè)。

所以,完全不用擔(dān)心QQ號(hào)會(huì)超過(guò)43億,在相當(dāng)長(zhǎng)的一段時(shí)間內(nèi),43億是達(dá)不到的。而且,騰訊現(xiàn)在做了各種限制,并不會(huì)允許一個(gè)人無(wú)限地注冊(cè)QQ號(hào)碼。

另外,如果一個(gè)QQ號(hào)被注冊(cè)了,但長(zhǎng)期不登錄,那么就相當(dāng)于占著茅坑不拉屎,浪費(fèi)資源。此時(shí),騰訊也會(huì)考慮對(duì)QQ號(hào)進(jìn)行回收,具體的邏輯就不說(shuō)了。

然而,凡事總有萬(wàn)一,如果有一天QQ號(hào)碼突破了43億,那也可以,對(duì)騰訊來(lái)說(shuō),意味著業(yè)務(wù)蓬勃發(fā)展,也是好事。那么,QQ后臺(tái)很多代碼就需要重構(gòu)了。

常用面試算法解法(巧用bitmap算法解開(kāi)騰訊面試題)(3)

三. QQ號(hào)和bitmap淵源

在騰訊的面試題中,經(jīng)常以QQ號(hào)碼為背景進(jìn)行考察。比如典型題目:文件中有40億個(gè)QQ號(hào)碼,如何進(jìn)行去重?

如果沒(méi)有敏感意識(shí)到使用bitmap,就是很糟糕很不應(yīng)該的事情,說(shuō)明基本沒(méi)有好好去準(zhǔn)備啊。bitmap圖解如下:

常用面試算法解法(巧用bitmap算法解開(kāi)騰訊面試題)(4)

unsigned char共8位,取值范圍是[0, 255],這個(gè)unsigned char的數(shù)值是255,能標(biāo)識(shí)0~7這些數(shù)字都存在。

同理,如下這個(gè)unsigned char類(lèi)型的值是254,它對(duì)應(yīng)的含義是:1~7這些數(shù)字是存在的,而數(shù)字0是不存的:

常用面試算法解法(巧用bitmap算法解開(kāi)騰訊面試題)(5)

由此可見(jiàn),一個(gè)unsigned char類(lèi)型的數(shù)據(jù),可以標(biāo)識(shí)0~7這8個(gè)整數(shù)的存在與否,這是很好理解的,以此類(lèi)推:

  • 一個(gè)unsigned int類(lèi)型數(shù)據(jù)可以標(biāo)識(shí)0~31這32個(gè)整數(shù)的存在與否。
  • 兩個(gè)unsigned int類(lèi)型數(shù)據(jù)可以標(biāo)識(shí)0~63這64個(gè)整數(shù)的存在與否。

說(shuō)白了,也就是4B的內(nèi)存,可以標(biāo)識(shí)32個(gè)整數(shù)的存在與否。如果還不清楚的話,我來(lái)畫(huà)個(gè)表格,逐步推演一下:

常用面試算法解法(巧用bitmap算法解開(kāi)騰訊面試題)(6)

由此可見(jiàn),512MB的內(nèi)存大小,剛好可以用來(lái)標(biāo)識(shí)所有的QQ號(hào)碼的存在與否,一切迎刃而解。下面,我們看一下bitmap的程序,很好懂,也很實(shí)用,輕輕松松地實(shí)現(xiàn)了標(biāo)記功能,順便去重。

#include <iostream>#include <set>#include <cstring>using namespace std; #define N 20 // 考究0~19這20個(gè)數(shù)字#define SHIFT 5#define MASK 0x1funsigned int a[1 N / 32] = {0}; // 設(shè)置第i位為1, 讓它處于點(diǎn)亮狀態(tài)void setOne(int i){ a[i >> SHIFT] |= (1 << (i & MASK));} // 設(shè)置第i位為0, 讓它處于熄滅狀態(tài)void setZero(int i){ a[i >> SHIFT] &= ~(1 << (i & MASK));} // 獲取第i位的狀態(tài)int getState(int i){ return (a[i >> SHIFT] & (1 << (i & MASK))) && 1;} int main(void) { // 把1,3,1,4,9,9,9這幾個(gè)值的狀態(tài)點(diǎn)亮,即狀態(tài)為1 setOne(1); setOne(3); setOne(1); setOne(4); setOne(9); setOne(9); setOne(9); int i = 0; for(i = 0; i < N; i ) { cout << i << "對(duì)應(yīng)的狀態(tài)為:--->" << getState(i) << endl; // 獲取狀態(tài) } cout << endl; return 0;}

編譯運(yùn)行一下,結(jié)果為:

0對(duì)應(yīng)的狀態(tài)為:--->01對(duì)應(yīng)的狀態(tài)為:--->12對(duì)應(yīng)的狀態(tài)為:--->03對(duì)應(yīng)的狀態(tài)為:--->14對(duì)應(yīng)的狀態(tài)為:--->15對(duì)應(yīng)的狀態(tài)為:--->06對(duì)應(yīng)的狀態(tài)為:--->07對(duì)應(yīng)的狀態(tài)為:--->08對(duì)應(yīng)的狀態(tài)為:--->09對(duì)應(yīng)的狀態(tài)為:--->110對(duì)應(yīng)的狀態(tài)為:--->011對(duì)應(yīng)的狀態(tài)為:--->012對(duì)應(yīng)的狀態(tài)為:--->013對(duì)應(yīng)的狀態(tài)為:--->014對(duì)應(yīng)的狀態(tài)為:--->015對(duì)應(yīng)的狀態(tài)為:--->016對(duì)應(yīng)的狀態(tài)為:--->017對(duì)應(yīng)的狀態(tài)為:--->018對(duì)應(yīng)的狀態(tài)為:--->019對(duì)應(yīng)的狀態(tài)為:--->0

QQ號(hào)碼和bitmap的淵源就是如此,以后在面試時(shí),不可忽視bitmap的妙用哦,也希望大家看完這篇文章后,有所收貨,心情愉快。

來(lái)源:https://mp.weixin.qq.com/s?__biz=MzU2NTEyNjIzMw==∣=2247488299&idx=1&sn=b53d3a768426e0d0b5ff547767e5ba53&utm_source=tuicool&utm_medium=referral

TAGS標(biāo)簽:  常用  面試  算法  解法  巧用  常用面試算法解法(巧

歡迎分享轉(zhuǎn)載→http://www.avcorse.com/read-219653.html

Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號(hào)-5 TXT地圖HTML地圖XML地圖