參考來源:html
http://www.cnblogs.com/jerry19880126/ios
http://blog.csdn.net/kingjinzi_2008/article/details/7785334面試
一、計算表達式x6+4x4+2x3+x+1最少須要作()次乘法算法
A、3 B、4 C、5 D、6數據庫
A。原式=x^2 * (x^4 + 4 * x^2 + 2*x) + x + 1,x^2用一次乘法,x^4當作是(x^2)^2,這樣用掉第二次乘法,外面的x^2 * () 是第三次乘法,全部常係數乘法都展開成連加。設計模式
二、給定3個int類型的正整數x,y,z,對以下4組表達式判斷正確的選項()數組
int a1=x+y-z; int b1=x*y/z;網絡
int a2=x-z+y; int b2=x/z*y;併發
int c1=x<<y>>z; int d1=x&y|z;ide
int c2=x>>z<<y; int d2=x|z&y;
A、a1必定等於a2
B、b1必定定於b2
C、c1必定等於c2
D、d1必定等於d2
A。
三、程序的完整編譯過程分爲是:預處理,編譯,彙編等,以下關於編譯階段的編譯優化的說法中不正確的是()
A、死代碼刪除指的是編譯過程直接拋棄掉被註釋的代碼;
B、函數內聯能夠避免函數調用中壓棧和退棧的開銷
C、For循環的循環控制變量一般很適合調度到寄存器訪問
D、強度削弱是指執行時間較短的指令等價的替代執行時間較長的指令
A。死代碼是指永遠不會執行到的代碼,不是註釋,好比if(0){…},大括號裏的就是死代碼。
四、以下關於進程的描述不正確的是()
A、進程在退出時會自動關閉本身打開的全部文件
B、進程在退出時會自動關閉本身打開的網絡連接
C、進程在退出時會自動銷燬本身建立的全部線程
D、進程在退出時會自動銷燬本身打開的共享內存
D。共享內存銷燬了,會對其餘正在使用這段內存的進程形成破壞。
五、在以下8*6的矩陣中,請計算從A移動到B一共有多少種走法?要求每次只能向上揮着向右移動一格,而且不能通過P;
A、492
B、494
C、496
D、498
A。其實是排列組合問題。A走到B共須要12步,其中7步必須向右,5步必須向上,但次序能夠不一樣,所以是C(7,12),要求P不能走,那麼走到P的可能次數是C(3,6),從P走到B的可能次數是C(4,6),所以結果是C(7,12) – C(3,6)*C(4,6)=492。
六、SQL語言中刪除一個表的指令是()
A、DROP TABLE
B、DELETE TABLE
C、DESTROY TABLE
D、REMOVE TABLE
A。不說了,
七、某產品團隊由美術組、產品組、client程序組和server程序組4個小組構成,每次構建一套完整的版本時,須要各個組發佈以下資源。美術組想客戶端提供圖像資源(須要10分鐘),產品組向client組和server提供文字內容資源(同時進行,10分鐘),server和client源代碼放置在不一樣工做站上,其完整編譯時間均爲10分鐘且編譯過程不依賴於任何資源,client程序(不包含任何資源)在編譯完畢後還須要完成對程序的統一加密過程(10分鐘)。能夠請問,從要完成一次版本構建(client與server的版本代碼與資源齊備),至少須要多少時間()
A、60分鐘
B、40分鐘
C、30分鐘
D、20分鐘
D。除了加密之外,剩下的事情在第一個10分鐘內能夠併發完成。
八、以下關於編譯連接的說法錯誤的是()
A、編譯優化會使得編譯速度變慢
B、預編譯頭文件能夠優化程序的性能
C、靜態連接會使得可執行文件偏大
D、動態連接庫會使進程啓動速度偏慢
B。優化編譯
九、以下關於連接的說法錯誤的是()
A、一個靜態庫中不能包含兩個同名全局函數的定義
B、一個動態庫中不能包含兩個同名全局函數的定義
C、若是兩個靜態庫都包含一個同名全局函數,他們不能同時被連接
D、若是兩個動態庫都包含一個同名全局函數,他們不能同時被連接
C。靜態庫中編譯器保證沒有同名函數,兩個靜態庫,編譯完成後,會在不一樣類庫,同名函數上加上一些參數或者其餘特定信息,從而在調用時區別,若是兩個動態庫都包含一個同名全局函數,他們不能同時被連接,由於全局函數是定義在類外的函數,成員函數就是定義在類中的函數
十、排序算法的穩定是指,關鍵碼相同的記錄排序先後相對位置不發生改變,下面哪一種排序算法是不穩定的()
A、插入排序
B、冒泡排序
C、快速排序
D、歸併排序
基礎題,C。
十一、下列說法中錯誤的是:()
A、插入排序某些狀況下複雜度爲O(n)
B、排序二叉樹元素查找的複雜度可能爲O(n)
C、對於有序列表的排序最快的是快速排序
D、在有序列表中經過二分查找的複雜度必定是O(n log2n)
C。A當數據徹底有序時就是O(n),B當數退化成線性表時(只有一叉時)出現,C快排只對無序、隨機序列有優點。D是對的。
十二、在程序設計中,要對兩個16K×16K的多精度浮點數二維數組進行矩陣求和時,行優先讀取和列優先讀取的區別是()
A、沒區別
B、行優先快
C、列優先快
D、2種讀取方式速度爲隨機值,沒法判斷
B。
1三、字符串www.qq.com全部非空子串(兩個子串若是內容相同則只算一個)個數是()
A、1024
B、1018
C、55
D、50
D.
1四、TCP的關閉過程,說法正確的是()
A、TIME_WAIT狀態稱爲MSL(Maximum Segment Lifetime)等待狀態
B、對一個established狀態的TCP鏈接,在調用shutdown函數以前調用close接口,可讓主動調用的一方進入半關閉狀態
C、主動發送FIN消息的鏈接端,收到對方迴應ack以前不能發只能收,在收到對方回覆ack以後不能發也不能收,進入CLOSING狀態
D、在已經成功創建鏈接的TCP鏈接上,若是一端收到RST消息可讓TCP的鏈接端繞過半關閉狀態並容許丟失數據。
D。//TIME_WAIT 是TCP連接斷開時一定出現的狀態,TCP下每條鏈接都有一個屬性叫作max segment lifetime,就是說該鏈接關閉後,要通過2*max segment lifetime的時間,纔算是真正的被關閉,才能被從新創建,以防止這條鏈路上還有東西在傳輸,停留在TIME_WAIT狀態的持續時間是最長分節生命週期(MSL)的兩倍,有時候稱之爲2MSL
1五、操做系統的一些特別端口要爲特定的服務作預留,必需要root權限才能打開的端口描述正確的是()
A、端口號在64512-65535之間的端口
B、全部小於1024的每一個端口
C、RFC標準文檔中已經聲明特定服務的相關端口,例如http服務的80端口,8080端口等
D、全部端口均可以不授權限限制打開
C。
1六、找工做的季節立刻就到了,不少同窗去圖書館借閱《面試寶典》這本書,如今圖書館外有6名同窗排隊,其中3名同窗要將手中的《面試寶典》還至圖書館,有3名同窗但願從圖書館中能夠借到《面試寶典》,若當前圖書館內已無庫存《面試寶典》,要保證借書的3名同窗能夠借到書,請問這6位同窗有多少種排隊方式()
A)60
B)120
C)180
D)360
C。卡特蘭數,C(n,2n)/(n+1),n是入棧元素的個數,這裏n=3,C(3,6)/4=5,同窗彼此是不一樣的,所以要全排列一下,結果爲5*3!*3!=180
2、填空題
一、除了10進制、2進制以外,16進製表達式在計算機領域中也常用(例如各類字符集的定義描述),下式:(2012)10+(AF1)16的結果是( )(請用10進製表示)。
4813
二、ack(3 , 3)的執行結果是多少?
int ack(int m,int n)
{
if(m == 0)
return n + 1;
else if(n == 0)
return ack(m-1,1);
else
return ack(m - 1 , ack(m , n-1));
}
61。耐心,ack(1,x)=2+x,ack(2,x)=3+x*2,ack(3,0)=5,ack(3,1)=ack(3,0)*2+3=13,ack(3,2)=ack(3,1)*2+3=29,ack(3,3)=ack(3,2)*3+2=61。
三、某互聯網產品(例如,一款網絡遊戲)同時在線曲線(Average Concurrency Users,ACU)24小時數據以下圖所示。現已知全天平均在線人數爲5000人,玩家每次登錄後平均在線時長爲2小時。請你估計一下,平均下來每分鐘約有( )個玩家登陸。
四、以下SQL語句是須要列出一個論壇版面第一頁(每頁顯示20個)的帖子(post)標題(title),並按照發布(create_time)降序排列:
SELECT title FROM post( )create_time DESC( )0,20
ORDER BY; LIMIT, 推薦SQL《學習指南》
五、爲了某項目須要,咱們準備構造了一種面向對象的腳本語言,例如,對全部的整數,咱們都經過Integer類型的對象來描述。在計算「1+2」時,這裏的「1」,「2」和結果「3」分別爲一個Integer對象。爲了下降設計複雜度,咱們決定讓Integer對象都是隻讀對象,也即在計算a=a+b後,對象a引用的是一個新的對象,而非改a所指對象的值。考慮到性能問題,咱們又引入兩種優化方案:(1)對於數值相等的 Integer對象,咱們不會重複建立。例如,計算「1+1」,這裏兩個「1」的引用的是同一個對象——這種設計模式叫作();(2)腳本語言解析器啓動時,默認建立數值範圍[1,32]的32個Integer對象。如今,假設咱們要計算表達式「1+2+3+…+40」,在計算過程須要建立的 Integer對象個數是()。
享元模式,40。1到7以及他們的和是不用建立的,從8開始,28(是1到7的和)+8=36,36須要建立,36+9=45,45須要建立…依次類推,在加數是32以前(含32)須要建立的對象是32-8+1=25,某數+32=某數以後33至40所表示的加數也要建立,這樣有8個加數 + 8個和,共有16個數須要建立,注意,加數中包含36,這個咱們已經建立了,因此有25+8+8-1=40個數的對象須要建立。
六、甲、乙兩我的在玩猜數字遊戲,甲隨機寫了一個數字,在[1,100]區間以內,將這個數字寫在了一張紙上,而後乙來猜。
若是乙猜的數字偏小的話,甲會提示:「數字偏小」
一旦乙猜的數字偏大的話,甲之後就不再會提示了,只會回答「猜對 或 猜錯」
問: 乙至少猜 多少次 猜能夠準確猜出這個數字,在這種策略下, 乙猜的第一個數字是 。
14次,第一次猜想數字爲14。思想是:每次猜大後,嘗試猜想的總次數是相等的。第一次猜想時,在1到100之間選擇某個數N1後,有三種狀況,一是直接選中了,這個機率比較小,對研究沒有意義,二是選擇偏大了,這時再也不提示了,只能在1至N1-1之間一個一個地選了,三是選擇偏小了,這時還有提示,能夠繼續在[N1+1,100]中選擇另外的數N2。能夠知道,若第一次就猜錯了,那麼嘗試總次數是N1-1+1=N1次(由於是在[1,N1-1]之間逐一取值,且N1自己用掉一次),若第一次猜得偏小,但第二次猜大了,嘗試總次數是[N1+1,N2-1]的元素個數加2(加2是N2和N1自己猜用掉一次),即爲N2-N1+1次,根據思想「每次猜錯後,嘗試猜想的總次數相等」,有N1=N2-N1+1,可知N2=2N1-1,增量爲N1-1。相似地,前兩次猜得偏小,但第三次猜大,嘗試總次數爲[N2+1,N3-1]的元素個數加3,即N3-N2+2,那麼有N3- N2+2=N1,N3=N2+N1-2,增量爲N1-2……依此類推,增量是隨着猜想次數的增長而逐1地減小。設最後一次猜想爲k,則Nk=N1+ (N1-1)+(N1-2)+…1,Nk是等於或大於100的第一個數,根據等差數列求和公式能夠算出N1=14,N2=27,N3=39… (14,27,39,50,60,69,77,84,90,95,99)。
http://blog.csdn.net/kingjinzi_2008/article/details/7785334
引入;
一道關於動態規劃的面試題——Google面試題:扔玻璃珠
某幢大樓有100層。你手裏有兩顆如出一轍的玻璃珠。當你拿着玻璃珠在某一層往下扔的時候,必定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有個臨界樓層。低於它的樓層,往下扔玻璃珠,玻璃珠不會碎,等於或高於它的樓層,扔下玻璃珠,玻璃珠必定會碎。玻璃珠碎了就不能再扔。如今讓你設計一種方式,使得在該方式下,最壞的狀況扔的次數比其餘任何方式最壞的次數都少。也就是設計一種最有效的方式。
首先,爲了保存下一顆玻璃珠本身玩,就採用最笨的辦法吧:從第一層開始試,每次增長一層,當哪一層扔下玻璃珠後碎掉了,也就知道了。不過最壞的狀況扔的次數可能爲100。
固然,爲了這一顆玻璃珠代價也高了點,仍是採起另一種辦法吧。隨便挑一層,假如爲N層,扔下去後,若是碎了,那就只能從第一層開始試了,最壞的狀況可能爲N。假如沒碎,就一次增長一層繼續扔吧,這時最壞的狀況爲100-N。也就是說,採用這種辦法,最壞的狀況爲max{N, 100-N+1}。之因此要加一,是由於第一次是從第N層開始扔。
不過仍是以爲不夠好,運氣好的話,挑到的N可能恰好是臨界樓層,運氣很差的話,要扔的次數仍是不少。不過回過頭看看第二種方式,有沒有什麼發現。假如沒摔的話,不如不要一次增長一層繼續扔吧,而是採起另一種方式:把問題轉換爲100-N,在這裏面找臨界樓層,這樣不就把問題轉換成用遞歸的方式來解決嗎?看下面:
假如結果都保存在F[101]這個數組裏面,那麼:
F[N]=100-N,
F[100]=min(max(1,1+F[N-1]),max(2,1+F[N-2]),……,max(N-1,1+F[1]));
看出來了沒有,其實最終就是利用動態規劃來解決這個問題。
下面是本身隨便寫的C++代碼:
[cpp] view plaincopy
#include<iostream>
using namespace std;
int dp[101] = { 0 };
void solve()
{
int i , j , k;
for(i = 2 ; i < 101 ; ++i)
{
dp[i] = i;
for(j = 1 ; j < i ; ++j)
{
k = (j>=(1 + dp[i-j])) ? j : (1 + dp[i-j]);
if(dp[i] > k)
dp[i] = k;
}
}
}
int main(void)
{
dp[0] = 0 , dp[1] = 1;
solve();
printf("%d\n",dp[100]);
return 0;
}
輸出結果爲14。也就是說,最好的方式只要試14次就可以得出結果了。
答案是先從14樓開始拋第一次;若是沒碎,再從27樓拋第二次;若是還沒碎,再從39樓拋第三次;若是還沒碎,再從50樓拋第四次;如此,每次間隔的樓層少一層。這樣,任何一次拋棋子碎時,都能確保最多拋14次能夠找出臨界樓層。
證實以下:
一、第一次拋棋子的樓層:最優的選擇必然是間隔最大的樓層。好比,第一次若是在m層拋下棋子,之後再拋棋子時兩次樓層的間隔必然不大於m層(你們能夠本身用反證法簡單證實)
二、從第二次拋棋子的間隔樓層最優的選擇必然比第一次間隔少一層,第三次的樓層間隔比第二次間隔少一層,如此,之後每次拋棋子樓層間隔比上一次間隔少一層。(你們不妨本身證實一下)
三、因此,設n是第一次拋棋子的最佳樓層,則n即爲知足下列不等式的最小天然數:
不等式以下: 1+2+3+...+(n-1)+n >= 100
由上式可得出n=14
即最優的策略是先從第14層拋下,最多拋14次確定能找出臨界樓層。
七、仔細閱讀如下函數
Int fuc(int m,int n)
{
if(m%n)==0
{
return n;
}
else
{
return fuc(n,m%n)
}
}
請問func(2012,2102)的結果是( )。
2。遞歸。,其實就是求最小公倍數,
加分題:
一、給定一個數組a[N],咱們但願構造數組b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。在構造過程:
不容許使用除法;
要求O(1)空間複雜度和O(n)時間複雜度;
除遍歷計數器與a[N] b[N]外,不可以使用新的變量(包括棧臨時變量、對空間和全局靜態變量等);
請用程序實現並簡單描述。
請參考http://www.mianwww.com/html/2012/11/17098.html,有擴展思路,值得學習、。
繼續觀察b[i]的結構發現,b[i]能夠寫成BaBb,其中Ba=a[0]*a[1]…*a[i-1],Bb=a[i+1]*a[i+2]…*a[n-1],天然的就聯想到了分別從頭和尾部遍歷a[n]計算Ba,Bb的方法
二、20世紀60年代,美國心理學家米爾格蘭姆設計了一個連鎖信件實驗。米爾格蘭姆把信隨即發送給住在美國各城市的一部分居民,信中寫有一個波士頓股票經紀人的名字,並要求每名收信人把這封信寄給本身認爲是比較接近這名股票經紀人的朋友。這位朋友收到信後再把信寄給他認爲更接近這名股票經紀人的朋友。最終,大部分信件都寄到了這名股票經紀人手中,每封信平均經受6.2詞到達。因而,米爾格蘭姆提出六度分割理論,認爲世界上任意兩我的之間創建聯繫最多隻須要6我的。
假設QQ號大概有10億個註冊用戶,存儲在一千臺機器上的關係數據庫中,每臺機器存儲一百萬個用戶及其的好友信息,假設用戶的平均好友個數大約爲25人左右。
第一問:請你設計一個方案,儘量快的計算存儲任意兩個QQ號之間是否六度(好友是1度)可達,並得出這兩位用戶六度可達的話,最短是幾度可達。
第二問:咱們但願獲得平均每一個用戶的n度好友個數,以增長對用戶更多的瞭解,如今若是每臺機器一秒鐘能夠返回一千條查詢結果,那麼在10天的時間內,利用給出的硬件條件,能夠統計出用戶的最多幾度好友個數?若是但願獲得更高的平均n度好友個數,能夠怎樣改進方案?
三、段頁式虛擬存儲管理方案的特色。
空間浪費小、存儲共享容易、存儲保護容易、能動態鏈接。
段頁式管理是段式管理和頁式管理結合而成,兼有段式和頁式管理的優勢,每一段分紅若干頁,再按頁式管理,頁間不要求連續(能動態鏈接);用分段方法分配管理做業,用分頁方法分配管理內存(空間浪費小)。
段頁式管理採用二維地址空間,如段號(S)、頁號(P)和頁內單元號(D);系統建兩張表格每一做業一張段表,每一段創建一張頁表,段表指出該段的頁表在內存中的位置;地址變換機構相似頁式機制,只是前面增長一項段號。因此存儲共享容易、存儲保護容易。