碼!研發麵試最常用的10大算法,你遇到過幾個?

2021-03-02 數盟

面試也是一門學問,在面試之前做好充分的準備則是成功的必須條件,而程式設計師在代碼面試時,常會遇到編寫算法的相關問題,比如排序、二叉樹遍歷等等。

在程式設計師的職業生涯中,算法亦算是一門基礎課程,尤其是在面試的時候,很多公司都會讓程式設計師編寫一些算法實例,例如快速排序、二叉樹查找等等。

本文總結了程式設計師在代碼面試中最常遇到的10大算法類型,想要真正了解這些算法的原理,還需程式設計師們花些功夫。

1.String/Array/Matrix

在Java中,String是一個包含char數組和其它欄位、方法的類。如果沒有IDE自動完成代碼,下面這個方法大家應該記住:

toCharArray() //get char array of a StringArrays.sort()  //sort an arrayArrays.toString(char[] a) //convert to stringcharAt(int x) //get a char at the specific indexlength() //string lengthlength //array size substring(int beginIndex) substring(int beginIndex, int endIndex)Integer.valueOf()//string to integerString.valueOf()/integer to string

String/arrays很容易理解,但與它們有關的問題常常需要高級的算法去解決,例如動態編程、遞歸等。

下面列出一些需要高級算法才能解決的經典問題:

Evaluate Reverse Polish Notation

Longest Palindromic Substring

單詞分割

字梯

Median of Two Sorted Arrays

正則表達式匹配

合併間隔

插入間隔

Two Sum

3Sum

4Sum

3Sum Closest

String to Integer

合併排序數組

Valid Parentheses

實現strStr()

Set Matrix Zeroes

搜索插入位置

Longest Consecutive Sequence

Valid Palindrome

螺旋矩陣

搜索一個二維矩陣

旋轉圖像

三角形

Distinct Subsequences Total

Maximum Subarray

刪除重複的排序數組

刪除重複的排序數組2

查找沒有重複的最長子串

包含兩個獨特字符的最長子串

Palindrome Partitioning

2.鍊表

在Java中實現鍊表是非常簡單的,每個節點都有一個值,然後把它連結到下一個節點。

class Node {    int val;    Node next;    Node(int x) {        val = x;        next = null;    }}

比較流行的兩個鍊表例子就是棧和隊列。

棧(Stack)

class Stack{    Node top;    public Node peek(){        if(top != null){            return top;        }        return null;    }    public Node pop(){        if(top == null){            return null;        }else{            Node temp = new Node(top.val);            top = top.next;            return temp;            }    }    public void push(Node n){        if(n != null){            n.next = top;            top = n;        }    }}

隊列(Queue)

class Queue{    Node first, last;     public void enqueue(Node n){        if(first == null){            first = n;            last = first;        }else{            last.next = n;            last = n;        }    }     public Node dequeue(){        if(first == null){            return null;        }else{            Node temp = new Node(first.val);            first = first.next;            return temp;        }      }}

值得一提的是,Java標準庫中已經包含一個叫做Stack的類,鍊表也可以作為一個隊列使用(add()和remove())。(鍊表實現隊列接口)如果你在面試過程中,需要用到棧或隊列解決問題時,你可以直接使用它們。

在實際中,需要用到鍊表的算法有:

插入兩個數字

重新排序列表

鍊表周期

Copy List with Random Pointer

合併兩個有序列表

合併多個排序列表

從排序列表中刪除重複的

分區列表

LRU緩存

3.樹&堆

這裡的樹通常是指二叉樹。

class TreeNode{    int value;    TreeNode left;    TreeNode right;}

下面是一些與二叉樹有關的概念:

二叉樹搜索:對於所有節點,順序是:left children <= current node <= right children;

平衡vs.非平衡:它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹;

滿二叉樹:除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點;

完美二叉樹(Perfect Binary Tree):一個滿二叉樹,所有葉子都在同一個深度或同一級,並且每個父節點都有兩個子節點;

完全二叉樹:若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。

堆(Heap)是一個基於樹的數據結構,也可以稱為優先隊列( PriorityQueue),在隊列中,調度程序反覆提取隊列中第一個作業並運行,因而實際情況中某些時間較短的任務將等待很長時間才能結束,或者某些不短小,但具有重要性的作業,同樣應當具有優先權。堆即為解決此類問題設計的一種數據結構。

下面列出一些基於二叉樹和堆的算法:

二叉樹前序遍歷

二叉樹中序遍歷

二叉樹後序遍歷

字梯

驗證二叉查找樹

把二叉樹變平放到鍊表裡

二叉樹路徑和

從前序和後序構建二叉樹

把有序數組轉換為二叉查找樹

把有序列錶轉為二叉查找樹

最小深度二叉樹

二叉樹最大路徑和

平衡二叉樹

4.Graph

與Graph相關的問題主要集中在深度優先搜索和寬度優先搜索。深度優先搜索非常簡單,你可以從根節點開始循環整個鄰居節點。下面是一個非常簡單的寬度優先搜索例子,核心是用隊列去存儲節點。


第一步,定義一個GraphNode

class GraphNode{    int val;    GraphNode next;    GraphNode[] neighbors;    boolean visited;    GraphNode(int x) {        val = x;    }    GraphNode(int x, GraphNode[] n){        val = x;        neighbors = n;    }    public String toString(){        return "value: "+ this.val;    }}

第二步,定義一個隊列

class Queue{    GraphNode first, last;    public void enqueue(GraphNode n){        if(first == null){            first = n;            last = first;        }else{            last.next = n;            last = n;        }    }    public GraphNode dequeue(){        if(first == null){            return null;        }else{            GraphNode temp = new GraphNode(first.val, first.neighbors);            first = first.next;            return temp;        }      }}

第三步,使用隊列進行寬度優先搜索

public class GraphTest {    public static void main(String[] args) {        GraphNode n1 = new GraphNode(1);        GraphNode n2 = new GraphNode(2);        GraphNode n3 = new GraphNode(3);        GraphNode n4 = new GraphNode(4);        GraphNode n5 = new GraphNode(5);        n1.neighbors = new GraphNode[]{n2,n3,n5};        n2.neighbors = new GraphNode[]{n1,n4};        n3.neighbors = new GraphNode[]{n1,n4,n5};        n4.neighbors = new GraphNode[]{n2,n3,n5};        n5.neighbors = new GraphNode[]{n1,n3,n4};        breathFirstSearch(n1, 5);    }    public static void breathFirstSearch(GraphNode root, int x){        if(root.val == x)            System.out.println("find in root");        Queue queue = new Queue();        root.visited = true;        queue.enqueue(root);        while(queue.first != null){            GraphNode c = (GraphNode) queue.dequeue();            for(GraphNode n: c.neighbors){                if(!n.visited){                    System.out.print(n + " ");                    n.visited = true;                    if(n.val == x)                        System.out.println("Find "+n);                    queue.enqueue(n);                }            }        }    }}

輸出結果:

value: 2 value: 3 value: 5 Find value: 5
value: 4

實際中,基於Graph需要經常用到的算法:

克隆Graph

5.排序

不同排序算法的時間複雜度,大家可以到wiki上查看它們的基本思想。


BinSort、Radix Sort和CountSort使用了不同的假設,所有,它們不是一般的排序方法。

下面是這些算法的具體實例,另外,你還可以閱讀: Java開發者在實際操作中是如何排序的。

歸併排序

快速排序

插入排序

6.遞歸和迭代

下面通過一個例子來說明什麼是遞歸。

問題:

這裡有n個臺階,每次能爬1或2節,請問有多少種爬法?

步驟1:查找n和n-1之間的關係

為了獲得n,這裡有兩種方法:一個是從第一節臺階到n-1或者從2到n-2。如果f(n)種爬法剛好是爬到n節,那麼f(n)=f(n-1)+f(n-2)。

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

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

public static int f(int n){    if(n <= 2) return n;    int x = f(n-1) + f(n-2);    return x;}

遞歸方法的時間複雜度指數為n,這裡會有很多冗餘計算。

f(5)f(4) + f(3)f(3) + f(2) + f(2) + f(1)f(2) + f(1) + f(2) + f(2) + f(1)

該遞歸可以很簡單地轉換為迭代。

public static int f(int n) {    if (n <= 2){        return n;    }    int first = 1, second = 2;    int third = 0;    for (int i = 3; i <= n; i++) {        third = first + second;        first = second;        second = third;    }    return third;}

在這個例子中,迭代花費的時間要少些。關於迭代和遞歸,你可以去 這裡看看。

7.動態規劃

動態規劃主要用來解決如下技術問題:

通過較小的子例來解決一個實例;

對於一個較小的實例,可能需要許多個解決方案;

把較小實例的解決方案存儲在一個表中,一旦遇上,就很容易解決;

附加空間用來節省時間。

上面所列的爬臺階問題完全符合這四個屬性,因此,可以使用動態規劃來解決:

public static int[] A = new int[100]; public static int f3(int n) {    if (n <= 2)        A[n]= n;    if(A[n] > 0)        return A[n];    else        A[n] = f3(n-1) + f3(n-2);//store results so only calculate once!    return A[n];}

一些基於動態規劃的算法:

編輯距離

最長回文子串

單詞分割

最大的子數組

8.位操作

位操作符:


從一個給定的數n中找位i(i從0開始,然後向右開始)

public static boolean getBit(int num, int i){    int result = num & (1<<i);    if(result == 0){        return false;    }else{        return true;    }}

例如,獲取10的第二位:

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

典型的位算法:

Find Single Number

Maximum Binary Gap

9.概率

通常要解決概率相關問題,都需要很好地格式化問題,下面提供一個簡單的例子:

有50個人在一個房間,那麼有兩個人是同一天生日的可能性有多大?(忽略閏年,即一年有365天)

算法:

public static double caculateProbability(int n){    double x = 1;    for(int i=0; i<n; i++){        x *=  (365.0-i)/365.0;    }    double pro = Math.round((1-x) * 100);    return pro/100;}

結果:

calculateProbability(50) = 0.97

10.組合和排列

組合和排列的主要差別在於順序是否重要。

例1:

1、2、3、4、5這5個數字,輸出不同的順序,其中4不可以排在第三位,3和5不能相鄰,請問有多少種組合?

例2:

有5個香蕉、4個梨、3個蘋果,假設每種水果都是一樣的,請問有多少種不同的組合?

基於它們的一些常見算法

排列

排列2

排列順序

end.

文章來源:ProgramCreek

媒體合作請聯繫:
郵箱:contact@dataunion.org

相關焦點

  • 【精選乾貨】研發麵試最常用的10大算法,你遇到過幾個?
    面試也是一門學問,在面試之前做好充分的準備則是成功的必須條件,而程式設計師在代碼面試時,常會遇到編寫算法的相關問題,比如排序、二叉樹遍歷等等。在程式設計師的職業生涯中,算法亦算是一門基礎課程,尤其是在面試的時候,很多公司都會讓程式設計師編寫一些算法實例,例如快速排序、二叉樹查找等等。
  • 10大機器學習算法及應用,你知道幾個?
    來源:kdnuggets作者:James Le翻譯:序媛本文導讀:本文將為大家盤點,機器學習領域都有哪些常用的算法。毫無疑問,在過去兩年中,機器學習和人工智慧的普及度都得到了大幅提升。機器學習算法可分為三個大類:有監督學習、無監督學習和強化學習。
  • 算法工程師研發技能表
    所以很難有一個一概而論的算法工程師技術棧。比如說做圖像方向的有機器視覺算法崗、做文本方向的有自然語言處理算法崗、做語音的又有語音識別算法崗。本文僅對算法工程師常用的、基礎的、必備的研發技能進行梳理。也就是說,不論你是做哪個業務場景下的算法工作,這些基礎研發技能都是必知必會的。這組技能清單主要包括兩大類型,一類是理論技術,另一類是程式語言和工具類。
  • 10 個常用機器學習算法
    (給算法愛好者加星標,修煉編程內功)來源:機器之心   本文介紹了 10 大常用機器學習算法,包括線性回歸、Logistic
  • 【面試分享】大三本科生拿到阿里研發、網易郵件、騰訊微信實習offer面試經驗分享
    比如:· 如果讓你設計KVO, 要怎麼設計· 現在你是如何適配的· 比較下storyboard和全代碼· 如果有1w張圖片要在屏幕滾動顯示(每張圖片滿屏), 至少要幾個cell,如何實現循環滾動· 平時是怎麼進行測試的, 內存方面怎麼測試·
  • 看看高薪,算法工程師面試,讓你懷疑人生
    面試一下午,從1:40到5:20,共四面,前三個為技術面,第四個為leader面,leader也問了一些技術,未來的規劃,來這裡之後會幹什麼,反正就是泛泛的聊,還有就是你印象最深刻的一件事,最感動的,最難忘的一件事,哎,這些問題。先是40分鐘一套卷子,讓做題,5道編程題,3道問答題可以選擇做。我當時40分鐘把5道編程寫完就沒時間了。
  • 九章算法班 | 1個月搞定面試算法,更有內推等著你
    《九章算法V5.0》配套最新 LintCode OJ 題庫。根據最新的面經對配套作業題進行了大換血,在面試中遇到原題的概率更高了。比如,樹狀數組是近期 Facebook、 Google面試中出現過數據結構考點。
  • 程序開發最常用的10大算法
    } }}值得一提的是,Java標準庫中已經包含一個叫做Stack的類,鍊表也可以作為一個隊列使用(add()和remove())。下面列出一些基於二叉樹和堆的算法:●二叉樹前序遍歷●二叉樹中序遍歷●二叉樹後序遍歷●字梯●驗證二叉查找樹●把二叉樹變平放到鍊表裡●二叉樹路徑和●從前序和後序構建二叉樹●把有序數組轉換為二叉查找樹●把有序列錶轉為二叉查找樹●最小深度二叉樹
  • 2021屆的你,靠什麼贏得抖音offer?(抖音獨家面試大全)
    如果你想拼敢闖,可以關注這幾個維度:平臺的大小、 業務發展空間、技術指導和天花板、工作節奏和氛圍、薪資福利待遇,然後進行重要性/優先級排序,分析當下的自己最關注什麼、最想要獲得什麼,哪家公司和業務可以滿足你的訴求,當下和未來發展怎麼樣?
  • 面試時,這幾個最常問的問題,你遇到過嗎?
    下面,我就總結了幾個職場中,面試時,HR最喜歡問的幾個問題。2:其實這些東西,HR在電話讓你來面試之前,就已經在你的簡歷上了解到了。他們最想聽的是:「應聘者哪方面技能比較出色、最專業知識領域是什麼、做過什麼成功的案例」這才是HR最想了解的,因為企業需要確定的是,你是否能夠更好地,勝任目前正在招聘的崗位。第二:對於薪資,你的心理預期是多少呢?
  • 面試經驗分享之數據結構、算法題
    前言面試 IT 企業的研發崗位,數據結構和算法顯然是必考的項目。俺只學過普通的數據結構課程,沒讀過 STL,也沒有過 ACM 的訓練和比賽經歷,在一開始面對這樣類型題目的時候,心裡還是十分忐忑的。大大小小几十場面試下來,自己在這方面總算有了一定的心得積累,在此拋磚引玉, 以饗讀者。
  • KDnuggets調查數據科學家最常用的10種算法
    翻譯|姜範波 lizyjieshu   校對|Lorine大數據文摘作品,轉載具體要求見文末 最新的KDnuggets調查統計了數據科學家們實際工作中最常使用的算法,在大多數學術和產業界,都有驚人發現哦!
  • 算法工程師面試前需掌握的18大面試題!
    【IT168 評論】算法是比較複雜又基礎的學科,每個學編程的人都會學習大量的算法。而根據統計,以下這18個問題是面試中最容易遇到的,本文給出了一些基本答案,供算法方向工程師或對此感興趣的程式設計師參考。1)請簡單解釋算法是什麼?
  • 面試官:「這10項都沒準備好,你面試個啥?」
    在這篇文章裡,我還會給出關於你可能在面試中會遇到的問題的一些提示。面試候選人幫助我認識了一些有廣泛背景和技能的人。從CS / ECE,統計/數學到土木/機械工程,這些領域的人我都接觸過。所幸我有機會能在這裡與這些出色的人交談。在我講更多細節之前,我想提一下,近年來,業界把「數據科學家」也叫做「機器學習科學家」或「應用科學家」。
  • 2020年必學的 10 大算法
    大常用機器學習算法,包括線性回歸、Logistic 回歸、線性判別分析、樸素貝葉斯、KNN、隨機森林等。不過,該算法在大量的複雜問題中十分有效。6. K 最近鄰算法K 最近鄰(KNN)算法是非常簡單而有效的。KNN 的模型表示就是整個訓練數據集。這很簡單吧?對新數據點的預測結果是通過在整個訓練集上搜索與該數據點最相似的 K 個實例(近鄰)並且總結這 K 個實例的輸出變量而得出的。
  • 程式設計師面試過關必備的5大網站,你用過幾個?
    但是,也有部分程式設計師面試掛掉了,暫時還找不到工作。其實,要順利通過面試還是非常有必要去刷一些編程面試題,認識一些面試指南。下面w3cschool給程式設計師小夥伴們推薦5大面試相關的網站,幫助你順利通過各種面試。
  • Java面試的的時候你被提過哪些問題?
    同學們在踏出校園那一刻起,邊開始進入了社會,面臨著找工作、面試,那麼,當你被面試的時候,哪些Java題被面試官提問過?OOM你遇到過哪些情況,SOF你遇到過哪些情況。16. Java面向對象的三個特徵與含義。17. Override和Overload的含義去區別。18. Interface與abstract類的區別。19. Static class 與non static class的區別。20. java多態的實現原理。21.
  • 阿里螞蟻金服Java程式設計師面試的11個問題,你會幾個呢?
    在分享螞蟻金服Java程式設計師面經前,不妨來看下Java程式設計師面試時要注意3大要點:0、重視基礎在面試之前,有必要將基礎的知識點重新過一遍,比如並發優缺點、內存可見性、鎖、同步、線程池框架等。比如面向對象基本知識,這幾乎是面試必考的,比如什麼是類,繼承,多態等等。面向對象的特徵:抽象、繼承、封裝、多態常見算法的應用,包括算法基礎和Java編程實現。總結一般是進行分類總結,善於抓重點,以便抓住面試官痛點。
  • 備戰跳槽季:大廠面試官總結 16 大常考算法知識點
    在如今的環境下,想要換一份理想的工作更是需要「找準時機,抓住機會」,當然在面試前的準備是必不可少的。極客大學邀請了算法訓練營的助教,請他們分享一下作為面試官喜歡考察候選人哪些能力、他們有哪些「 精選算法面試題 」。我們的助教們來自美團、百度或海外的一線網際網路公司,希望他們分享的經驗可以幫助到你。
  • HTTP狀態碼,你知道幾個??
    今天給大家分享之前小編面試過的一道面試題的答案,之前小編去面試,然後筆試是有一道寫出你所知道的http的狀態碼,但是真的只知道404.200.500