欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

編程面試的 9 大算法概念

Linux愛好者 ? 來源:未知 ? 作者:鄧佳佳 ? 2018-03-20 14:19 ? 次閱讀

以下是在編程面試中排名前 9 的算法相關(guān)的概念,我會(huì)通過一些簡單的例子來闡述這些概念。由于完全掌握這些概念需要更多的努力,因此這份列表只是作為一個(gè)介紹。本文將從Java的角度看問題,包含下面的這些概念:

1. 字符串

2. 鏈表

3. 樹

4. 圖

5. 排序

6. 遞歸 vs. 迭代

7. 動(dòng)態(tài)規(guī)劃

8. 位操作

9. 概率問題

1. 字符串

如果IDE沒有代碼自動(dòng)補(bǔ)全功能,所以你應(yīng)該記住下面的這些方法。

toCharArray()// 獲得字符串對應(yīng)的char數(shù)組

Arrays.sort()// 數(shù)組排序

Arrays.toString(char[]a)// 數(shù)組轉(zhuǎn)成字符串

charAt(intx)// 獲得某個(gè)索引處的字符

length()// 字符串長度

length// 數(shù)組大小

2. 鏈表

在Java中,鏈表的實(shí)現(xiàn)非常簡單,每個(gè)節(jié)點(diǎn)Node都有一個(gè)值val和指向下個(gè)節(jié)點(diǎn)的鏈接next。

classNode{

intval;

Nodenext;

Node(intx){

val=x;

next=null;

}

}

鏈表兩個(gè)著名的應(yīng)用是棧Stack和隊(duì)列Queue。

棧:

classStack{

Nodetop;

publicNode peek(){

if(top!=null){

returntop;

}

returnnull;

}

publicNode pop(){

if(top==null){

returnnull;

}else{

Nodetemp=newNode(top.val);

top=top.next;

returntemp;

}

}

publicvoidpush(Noden){

if(n!=null){

n.next=top;

top=n;

}

}

}

隊(duì)列:

classQueue{

Nodefirst,last;

publicvoidenqueue(Noden){

if(first==null){

first=n;

last=first;

}else{

last.next=n;

last=n;

}

}

publicNode dequeue(){

if(first==null){

returnnull;

}else{

Nodetemp=newNode(first.val);

first=first.next;

if(last==temp)last=first;

returntemp;

}

}

}

3. 樹

這里的樹通常是指二叉樹,每個(gè)節(jié)點(diǎn)都包含一個(gè)左孩子節(jié)點(diǎn)和右孩子節(jié)點(diǎn),像下面這樣:

classTreeNode{

intvalue;

TreeNodeleft;

TreeNoderight;

}

下面是與樹相關(guān)的一些概念:

平衡 vs. 非平衡:平衡二叉樹中,每個(gè)節(jié)點(diǎn)的左右子樹的深度相差至多為1(1或0)。

滿二叉樹(Full Binary Tree):除葉子節(jié)點(diǎn)以為的每個(gè)節(jié)點(diǎn)都有兩個(gè)孩子。

完美二叉樹(Perfect Binary Tree):是具有下列性質(zhì)的滿二叉樹:所有的葉子節(jié)點(diǎn)都有相同的深度或處在同一層次,且每個(gè)父節(jié)點(diǎn)都必須有兩個(gè)孩子。

完全二叉樹(Complete Binary Tree):二叉樹中,可能除了最后一個(gè),每一層都被完全填滿,且所有節(jié)點(diǎn)都必須盡可能想左靠。

譯者注:完美二叉樹也隱約稱為完全二叉樹。完美二叉樹的一個(gè)例子是一個(gè)人在給定深度的祖先圖,因?yàn)槊總€(gè)人都一定有兩個(gè)生父母。完全二叉樹可以看成是可以有若干額外向左靠的葉子節(jié)點(diǎn)的完美二叉樹。疑問:完美二叉樹和滿二叉樹的區(qū)別?

4. 圖

圖相關(guān)的問題主要集中在深度優(yōu)先搜索(depth first search)和廣度優(yōu)先搜索(breath first search)。

下面是一個(gè)簡單的圖廣度優(yōu)先搜索的實(shí)現(xiàn)。

1) 定義GraphNode

classGraphNode{

intval;

GraphNodenext;

GraphNode[]neighbors;

booleanvisited;

GraphNode(intx){

val=x;

}

GraphNode(intx,GraphNode[]n){

val=x;

neighbors=n;

}

publicStringtoString(){

return"value: "+this.val;

}

}

2) 定義一個(gè)隊(duì)列Queue

classQueue{

GraphNodefirst,last;

publicvoidenqueue(GraphNoden){

if(first==null){

first=n;

last=first;

}else{

last.next=n;

last=n;

}

}

publicGraphNode dequeue(){

if(first==null){

returnnull;

}else{

GraphNodetemp=newGraphNode(first.val,first.neighbors);

first=first.next;

returntemp;

}

}

}

3) 用隊(duì)列Queue實(shí)現(xiàn)廣度優(yōu)先搜索

publicclassGraphTest{

publicstaticvoidmain(String[]args){

GraphNoden1=newGraphNode(1);

GraphNoden2=newGraphNode(2);

GraphNoden3=newGraphNode(3);

GraphNoden4=newGraphNode(4);

GraphNoden5=newGraphNode(5);

n1.neighbors=newGraphNode[]{n2,n3,n5};

n2.neighbors=newGraphNode[]{n1,n4};

n3.neighbors=newGraphNode[]{n1,n4,n5};

n4.neighbors=newGraphNode[]{n2,n3,n5};

n5.neighbors=newGraphNode[]{n1,n3,n4};

breathFirstSearch(n1,5);

}

publicstaticvoidbreathFirstSearch(GraphNoderoot,intx){

if(root.val==x)

System.out.println("find in root");

Queuequeue=newQueue();

root.visited=true;

queue.enqueue(root);

while(queue.first!=null){

GraphNodec=(GraphNode)queue.dequeue();

for(GraphNoden:c.neighbors){

if(!n.visited){

System.out.print(n+" ");

n.visited=true;

if(n.val==x)

System.out.println("Find "+n);

queue.enqueue(n);

}

}

}

}

}

5. 排序

下面是不同排序算法的時(shí)間復(fù)雜度,你可以去wiki看一下這些算法的基本思想。

6. 遞歸 vs. 迭代

程序員來說,遞歸應(yīng)該是一個(gè)與生俱來的思想(a built-in thought),可以通過一個(gè)簡單的例子來說明。

問題: 有n步臺(tái)階,一次只能上1步或2步,共有多少種走法。

步驟1:找到走完前n步臺(tái)階和前n-1步臺(tái)階之間的關(guān)系。

為了走完n步臺(tái)階,只有兩種方法:從n-1步臺(tái)階爬1步走到或從n-2步臺(tái)階處爬2步走到。如果f(n)是爬到第n步臺(tái)階的方法數(shù),那么f(n) = f(n-1) + f(n-2)。

f(0) = 0;f(1) = 1;

步驟2: 確保開始條件是正確的。

publicstaticintf(intn){

if(n<=?2)returnn;

intx=f(n-1)+f(n-2);

returnx;

}

遞歸方法的時(shí)間復(fù)雜度是n的指數(shù)級(jí),因?yàn)橛泻芏嗳哂嗟挠?jì)算,如下:

f(5)

f(4) + f(3)

f(3) + f(2) + f(2) + f(1)

f(2) + f(1) + f(1) + f(0) + f(1) + f(0) + f(1)

f(1) + f(0) + f(1) + f(1) + f(0) + f(1) + f(0) + f(1)

直接的想法是將遞歸轉(zhuǎn)換為迭代:

publicstaticintf(intn){

if(n<=?2){

returnn;

}

intfirst=1,second=2;

intthird=0;

for(inti=3;i<=?n;i++){

third=first+second;

first=second;

second=third;

}

returnthird;

}

7. 動(dòng)態(tài)規(guī)劃

動(dòng)態(tài)規(guī)劃是解決下面這些性質(zhì)類問題的技術(shù):

一個(gè)問題可以通過更小子問題的解決方法來解決(譯者注:即問題的最優(yōu)解包含了其子問題的最優(yōu)解,也就是最優(yōu)子結(jié)構(gòu)性質(zhì))。

有些子問題的解可能需要計(jì)算多次(譯者注:也就是子問題重疊性質(zhì))。

子問題的解存儲(chǔ)在一張表格里,這樣每個(gè)子問題只用計(jì)算一次。

需要額外的空間以節(jié)省時(shí)間。

爬臺(tái)階問題完全符合上面的四條性質(zhì),因此可以用動(dòng)態(tài)規(guī)劃法來解決。

publicstaticint[]A=newint[100];

publicstaticintf3(intn){

if(n<=?2)

A[n]=n;

if(A[n]>0)

returnA[n];

else

A[n]=f3(n-1)+f3(n-2);//store results so only calculate once!

returnA[n];

}

8. 位操作

位操作符:

亦或 左移 右移
1|0=1 1&0=0 1^0=1 0010<<2=1000 1100>>2=0011 ~1=0

獲得給定數(shù)字n的第i位:( i 從 0 計(jì)數(shù),并從右邊開始)

publicstaticbooleangetBit(intnum,inti){

intresult=num&(1<

if(result==0){

returnfalse;

}else{

returntrue;

}

例如,獲得數(shù)字10的第2位:

i=1, n=101<<1= 101010&10=1010 is not 0, so return true;

9. 概率問題

解決概率相關(guān)的問題通常需要很好的規(guī)劃了解問題(formatting the problem),這里剛好有一個(gè)這類問題的簡單例子:

一個(gè)房間里有50個(gè)人,那么至少有兩個(gè)人生日相同的概率是多少?(忽略閏年的事實(shí),也就是一年365天)

計(jì)算某些事情的概率很多時(shí)候都可以轉(zhuǎn)換成先計(jì)算其相對面。在這個(gè)例子里,我們可以計(jì)算所有人生日都互不相同的概率,也就是:365/365 * 364/365 * 363/365 * ... * (365-49)/365,這樣至少兩個(gè)人生日相同的概率就是1 – 這個(gè)值。

publicstaticdoublecaculateProbability(intn){

doublex=1;

for(inti=0;i

x*=(365.0-i)/365.0;

}

doublepro=Math.round((1-x)*100);

returnpro/100;

}

calculateProbability(50) = 0.97

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4631

    瀏覽量

    93398
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3638

    瀏覽量

    94012

原文標(biāo)題:經(jīng)典:編程面試的 10 大算法概念匯總

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)在釘釘和企業(yè)微信上使用AI視頻面試——AI得賢招聘官操作說明

    面試): 計(jì)算機(jī)編程能力評(píng)估考試: 在線認(rèn)知能力測試: 在線背景調(diào)查: AI得賢招聘官基于篇章級(jí)的語義識(shí)別算法對候選人面試回答進(jìn)行語義分析,并通過計(jì)算機(jī)視覺和聲音
    發(fā)表于 03-07 19:30

    史上最全面Java面試匯總(面試題+答案)精選資料分享

    JAVA面試精選【Java基礎(chǔ)第一部分】JAVA面試精選【Java基礎(chǔ)第二部分】JAVA面試精選【Java基礎(chǔ)第三部分】JAVA面試精選【Java
    發(fā)表于 07-21 09:39

    編程之美--微軟技術(shù)面試心得

    編程之美--微軟技術(shù)面試心得本書收集了約60道算法和程序設(shè)計(jì)題目,這些題目大部分在近年的筆試,面試中出現(xiàn)過,或者是被微軟員工熱烈討論過。作者試圖從書中各種有趣的問
    發(fā)表于 10-23 16:02 ?75次下載
    <b class='flag-5'>編程</b>之美--微軟技術(shù)<b class='flag-5'>面試</b>心得

    C/C++程序員面試寶典

    面試C或C++的必備用書,詳細(xì)講了面試和筆試中常遇到的編程細(xì)節(jié)問題,對找工作很有幫助
    發(fā)表于 11-03 10:43 ?0次下載

    一份過冬存糧:算法工程師必備的面試技能雷達(dá)圖

    當(dāng)然,上面只是讓大家體會(huì)一下什么是這四項(xiàng)素質(zhì),真實(shí)的計(jì)算廣告算法工程師面試中,你不一定要都掌握,也不一定局限于這些內(nèi)容。如果你遇到一位資深的面試官,他不會(huì)預(yù)設(shè)一個(gè)框架往面試者身上套,而
    的頭像 發(fā)表于 01-14 09:13 ?2211次閱讀

    如何準(zhǔn)備算法工程師的面試需要知道哪些知識(shí)技能

    今天我們不聊paper,換一個(gè)輕松一點(diǎn)的話題,聊一聊如何準(zhǔn)備算法工程師的面試。所以希望自己的經(jīng)驗(yàn)?zāi)軐δ阌兴鶐椭?,也非常歡迎其他面試官能夠多留言探討自己的面試經(jīng)驗(yàn)。
    的頭像 發(fā)表于 02-03 09:15 ?5585次閱讀

    一位算法工程師的筆試及面試總結(jié)

    解決業(yè)務(wù)問題。整個(gè)求職過程是一個(gè)和互聯(lián)網(wǎng)企業(yè)雙向了解,接收面試反饋后不斷思考、調(diào)整職業(yè)規(guī)劃與重復(fù)完善知識(shí)體系的過程,本文通過介紹我個(gè)人的求職過程,向后來者揭示國內(nèi)互聯(lián)網(wǎng)企業(yè)對算法&機(jī)器學(xué)習(xí)崗的要求、面試過程、薪資狀況,也分享一些
    的頭像 發(fā)表于 02-15 11:47 ?1.1w次閱讀

    深信服面算法工程師面試經(jīng)歷

    深信服面的算法工程師,深信服的面試很專業(yè),不愧是重技術(shù)的公司,經(jīng)歷了三面,雖然掛了難免失落,但是還是很慶幸有這次的經(jīng)歷。掛的原因是自己沒有準(zhǔn)備充分,完全是去裸面的。感覺自己掛在了二面,二面面試官人很好,想是給個(gè)三面的機(jī)會(huì)吧,特別
    的頭像 發(fā)表于 03-22 14:38 ?3759次閱讀

    算法工程師的面試真的是一門玄學(xué)嗎

    經(jīng)常參加面試的同學(xué)肯定有過這種感覺,即使面試過程非常順暢,即使你本身是一個(gè)面霸,甚至god like,也經(jīng)常有失手的時(shí)候。所以很多同學(xué)把面試歸結(jié)為一門“玄學(xué)”。那么算法工程師的
    的頭像 發(fā)表于 07-29 17:29 ?2081次閱讀

    編程面試最常見的14種模式

    這里我將列出最常見的 14 種模式,它們可被用于解決任何編程面試問題。另外我還會(huì)說明如何識(shí)別每種模式,并會(huì)為每種模式提供一些問題示例。
    的頭像 發(fā)表于 08-01 11:24 ?3213次閱讀

    算法工程師面試是一門玄學(xué)嗎

    但經(jīng)常參加面試的同學(xué)肯定有過這種感覺,即使面試過程非常順暢,即使你本身是一個(gè)面霸,甚至god like,也經(jīng)常有失手的時(shí)候。所以很多同學(xué)把面試歸結(jié)為一門“玄學(xué)”。那么算法工程師的
    的頭像 發(fā)表于 08-16 16:40 ?1886次閱讀

    編程面試9大技巧

    它縮小了問題的范圍。例如,也許你會(huì)問面試官,“這個(gè)數(shù)組中的所有整數(shù)都是正的嗎?”。如果答案是肯定的,那么你就不必考慮整個(gè)負(fù)整數(shù)空間,這可能使問題更容易解決。
    的頭像 發(fā)表于 12-09 15:34 ?2661次閱讀

    10個(gè)經(jīng)典C語言面試基礎(chǔ)算法及代碼

    10個(gè)經(jīng)典的C語言面試基礎(chǔ)算法及代碼
    的頭像 發(fā)表于 01-16 11:09 ?2905次閱讀

    什么是算法編程?最常用的算法有哪些

    編程算法是什么意思?相信問這個(gè)問題的同學(xué)一定是個(gè)零基礎(chǔ)剛剛?cè)腴T編程的小白,針對這個(gè)問題,本文將介紹編程算法的基本
    的頭像 發(fā)表于 07-26 11:11 ?9097次閱讀

    Linux應(yīng)用編程的基本概念

    Linux應(yīng)用編程涉及到在Linux環(huán)境下開發(fā)和運(yùn)行應(yīng)用程序的一系列概念。以下是一些涵蓋Linux應(yīng)用編程的基本概念。
    的頭像 發(fā)表于 10-24 17:19 ?293次閱讀