想去面試?這10道最高頻的手撕代碼題都會了嗎?

2021-02-13 Python編程

想去看機會?下面這10道最高頻的手撕代碼面試題都會了嗎?

相信我,徹底掌握以下這10道題的解法,你順利做出手撕代碼面試題目的概率至少不低於50%。

1,快速排序

題目形式:手寫一下快速排序算法。

題目難度:中等。

出現概率:約50%。手寫快排絕對是手撕代碼面試題中的百獸之王,掌握了它就是送分題,沒有掌握它就是送命題。

參考代碼:

def quick_sort(arr,start=0,end=None):
    if end is None:
        end = len(arr)-1
    if end<=start:
        return(arr)
    i,j = start,end
    ref = arr[start]
    while j>i:
        if arr[j]>= ref:
            j = j - 1
        else:
            
            arr[i],arr[j],arr[i+1] = arr[j],arr[i+1],arr[i]
            i = i + 1
    quick_sort(arr,start=start,end = i-1)
    quick_sort(arr,start=i+1,end = end)
    return(arr)

print(quick_sort([1,1,3,3,2,2,6,6,6,5,5,7]))

輸出結果:

[1, 1, 2, 2, 2, 3, 5, 5, 6, 6, 6, 7]

2,二分查找

題目形式:手寫一下二分查找算法。給定一個有序數組 arr 和一個目標元素 target ,返回該 target 在 arr 中的索引,若不存在,返回-1。

題目難度:簡單。

出現概率:約30%。二分查找絕對是手寫代碼題中的百獸之後,沒有妃子可以和她爭寵。連個二分查找都寫不出來,還來應聘程式設計師,你是不是對程式設計師這個職業有什麼誤解?

參考代碼:

def binary_search(arr,target):
    start,end = 0,len(arr)-1
    while True:
        if end - start <=1:
            if target == arr[start]:
                return(start)
            elif target == arr[end]:
                return(end)
            else:
                return(-1)

        mid = (start + end)//2
        if arr[mid]>=target:
            end = mid
        else:
            start = mid

print(binary_search([1,4,7,8,9,12],9))
print(binary_search([1,4,7,8,9,12],3))

輸出結果:

3,爬樓梯

題目形式:有一個樓梯,總共有10級臺階,每次只能走一級或者兩級臺階,全部走完,有多少種走法?

題目難度:簡單。

出現概率:約20%。爬樓梯問題是手寫代碼題中的百獸之豹。爬樓梯問題可以用遞歸來解決,但是如果考慮到時間複雜度,最好用動態規劃的思想來處理,這是一個動態規划算法的教科書級別的案例。連個樓梯都爬不明白,這個算法基礎令人堪憂啊!

參考代碼:

def climb_stairs(n):
    if n==1:
        return 1
    if n==2:
        return 2
    a,b = 1,2
    i = 3
    while i<=n:
        a,b = b,a+b
        i +=1
    return b

print(climb_stairs(10))

輸出結果:

4,兩數之和

題目形式:尋找列表中滿足兩數之和等於目標值的元素的下標。例如:arr = [2,7,4,9],target = 6  則返回 [0,2],若不存在,返回空列表[]。

題目難度:簡單。

出現概率:約20%。兩數之和是手寫代碼題中的百獸之狼。兩數之和問題考察候選人對哈希表可以用空間換取時間這個特性的理解。哎呦喂,寫個兩數之和還整上兩重循環了,你這時間複雜度是多少啊?

參考代碼:

def sum_of_two(arr,target):
    dic = {}
    for i,x in enumerate(arr):
        j = dic.get(target-x,-1)
        if j != -1:
            return((j,i))
        else:
            dic[x] = i
    return([])

arr = [2,7,4,9]
target = 6
print(sum_of_two(arr,target))

輸出結果:

5,最大回撤

題目形式:有一個數組,求其中兩個數x,y,滿足x的索引小於y的索引,使得 x-y 最大。例如 arr = [3,7,2,6,4,1,9,8,5], 最大回撤是6,對應的x=7,y=1。

題目難度:中等。

出現概率:約20%。這道題目可能以買賣股票的最佳時機,或者最大抬升等各種形式出現,這也是一道動態規劃的史詩級範例。呦呵,又整上兩重循環了,這循環寫的很可以啊。

參考代碼:

def max_drawdown(arr):
    assert len(arr)>2, "len(arr) should > 2!"
    x,y = arr[0:2]
    xmax = x
    maxdiff = x-y

    for i in range(2,len(arr)):
        if arr[i-1] > xmax:
            xmax = arr[i-1]
        if xmax - arr[i] > maxdiff:
            maxdiff = xmax - arr[i]
            x,y = xmax,arr[i]

    print("x=",x,",y=",y)
    return(maxdiff)

print(max_drawdown([3,7,2,6,4,1,9,8,5]))

輸出結果:

6,合併兩個有序數組

題目形式:給定兩個按升序排列的有序數組,將它們合併成一個新的有序數組。例如:a = [1,2,6,8], b = [2,4,7,10],輸出為 arr = [1,2,2,4,6,7,8,10]

題目難度:簡單。

出現概率:約15%。這道題目考察的是歸併排序的基本思想。注意,這兩個數組是有序的呢,你怎麼可以無視這麼有利的條件直接拼接上兩個數組開始冒泡了???

參考代碼:

def merge_sorted_array(a,b):
    c = []
    i,j = 0,0
    while True:
        if i==len(a):
            c.extend(b[j:])
            return(c)
        elif j==len(b):
            c.extend(a[i:])
            return(c)
        else:
            if a[i]<b[j]:
                c.append(a[i])
                i=i+1
            else:
                c.append(b[j])
                j=j+1

print(merge_sorted_array([1,2,6,8],[2,4,7,10]))

輸出結果:

[1, 2, 2, 4, 6, 7, 8, 10]

7,最大連續子數組和

題目形式:給定一個數組,求其最大連續子數組的和。例如:arr = [1,5,-10,2,5,-3,2,6,-3,1].  輸出為:12。對應的連續子數組為 [2,5,-3,2,6]。

題目難度:中等。

出現概率:約15%。這道題目也是一道動態規劃的祖傳範例。同學,你的這個兩重循環寫的確實很6,但是我們不能認為你的這道題目做對了!

參考代碼:

def max_sub_array(arr):
    n = len(arr)
    maxi,maxall = arr[0],arr[0]
    for i in range(1,n):
        maxi = max(arr[i],maxi + arr[i])
        maxall = max(maxall,maxi)
    return(maxall)

print(max_sub_array([1,5,-10,2,5,-3,2,6,-3,1]))

輸出結果:

8,最長不重複子串

題目形式:給定一個字符串,找出沒有重複字符的最長的子串。例如輸入「abcbefgf」,答案是 「cbefg」。

題目難度:困難。

出現概率:約10%。這是一道動態規劃+哈希查找的綜合應用題。這道題能做出來,你的代碼功底很可以啊。對了,你的期望薪資是多少?

參考代碼:

def longest_substr(s):    
    dic = {}
    start,maxlen,substr = 0,0,""

    for i,x in enumerate(s):
        if x in dic:
            start = max(dic[x]+1,start)
            dic[x] = i   
        else:
            dic[x] = i

        if i-start+1>maxlen:
            maxlen = i-start+1
            substr = s[start:i+1]
    return(substr)

print(longest_substr("abcbefgf"))
print(longest_substr("abcdef"))
print(longest_substr("abbcddefh"))

輸出結果:

9,全排列

題目形式:給定一個數組,找出其所有可能的排列。例如: arr = [1,1,3],輸出為 [[1,1,3],[1,3,1],[3,1,1]]。

題目難度:中等

出現概率:約10%。這是一道動態規劃+排列組合的綜合應用題。同學,你這裡用遞歸的話你的這個時間複雜度得有多少?我們這個數組一旦有幾十個元素的話,你這還能跑得動嗎?

參考代碼:

import numpy as np 
def permutations(arr):
    if len(arr)<=1:
        return([arr])
    t = [arr[0:1]]
    i = 1
    while i<=len(arr)-1:
        a = arr[i]
        t = [xs[0:j]+[a]+xs[j:] for xs in t for j in range(i+1)]
        t = np.unique(t,axis=0).tolist()
        i = i+1
    return(t)
print(permutations([1,1,3]))

輸出結果:

[[1, 1, 3], [1, 3, 1], [3, 1, 1]]

10,三數之和

題目形式:給定一個數組和目標數target,找出數組中a,b,c滿足 a+b+c = target 的所有組合。例如:arr = [-3,-1,-2,1,2,3],target = 0。輸出為 [(-3,1,2),(-2,-1,3)]

題目難度:困難

出現概率:約5%。這是一道非常有技巧的題目。你可以嘗試先將arr排序。注意,我們的時間複雜度要求為O(n**2) ,空間複雜度要求O(1),對,就是這麼嚴格,你要好好想想……喲,有思路啦……emmm……大體上符合要求……同學,你現在手上還有其他家的offer嗎?

參考代碼:

def sum_of_three(arr,target):
    assert len(arr)>=3,"len(arr) should >=3!"
    arr.sort()
    ans = set()
    for k,c in enumerate(arr):
        i,j = k+1,len(arr)-1
        while i<j:
            if arr[i]+arr[j]+c <target:
                i = i+1
            elif arr[i]+arr[j]+c > target:
                j = j-1
            else:
                ans.update({(arr[k],arr[i],arr[j])})
                i = i+1
                j = j-1
    return(list(ans))

print(sum_of_three([-3,-1,-2,1,2,3],0))

輸出結果:

[(-2, -1, 3), (-3, 1, 2)]

●編號757,輸入編號直達本文

●輸入m獲取文章目錄

算法與數據結構

更多推薦25個技術類公眾微信

涵蓋:程序人生、算法與數據結構、黑客技術與網絡安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

相關焦點

  • leetcode 刷500道題,筆試/面試穩嗎?
    ,相信大部分人都會去刷 Leetcode,有讀者問?如果我在 leetcode 堅持刷它個 500 道題,以後筆試/面試穩嗎?這裡我說下我的個人看法,我認為不穩。下面說說為啥不穩以及算法題應該如何刷、如何學才比較好,當然,也會推薦自己學過的資料。
  • leetcode 刷500道題,筆試/面試穩嗎?別以為你自己穩了
    來源公眾號:苦逼的碼農作者:帥地想要學習算法、應付筆試或者應付面試手撕算法題,相信大部分人都會去刷 Leetcode,有讀者問?如果我在 leetcode 堅持刷它個 500 道題,以後筆試/面試穩嗎?
  • LeetCode Top 100 高頻算法題 23. Merge k Sorted Lists
    ,即LeetCode上最高頻的100道求職面試算法題。小編和實驗室同學之前面試找工作,也只刷了劍指offer和這top 100算法題,在實際面試中也遇到了很多LeetCode上的原題。劍指offer算法最優解之前和大家分享了,LeetCode Top 100這100道算法題,每道題小編都刷了很多遍,並且總結了一種最適合面試時手撕算法的最優解法。後續每天和大家分享一道LeetCode top 100高頻算法題,以及小編總結的最優解法。
  • LeetCode Top 100 高頻算法題 02:Add Two Numbers
    ~LeetCode Top 100高頻算法題,即LeetCode上最高頻的100道求職面試算法題。小編和實驗室同學之前面試找工作,也只刷了劍指offer和這top 100算法題,在實際面試中也遇到了很多LeetCode上的原題。劍指offer算法最優解之前和大家分享了,LeetCode Top 100這100道算法題,每道題小編都刷了很多遍,並且總結了一種最適合面試時手撕算法的最優解法。後續每天和大家分享一道LeetCode top 100高頻算法題,以及小編總結的最優解法。
  • LeetCode Top 100 高頻算法題 53. Maximum Subarray
    由於公眾號做了改版,為了保證公眾號的文章可以準時推送到你手裡,大家記得點擊上方藍色」菜鳥名企夢「,將咱們的公眾號 加星標置頂 ,在此真誠的表示感謝~LeetCode Top 100高頻算法題,即LeetCode上最高頻的100道求職面試算法題。
  • LeetCode Top 100 高頻算法題 21. Merge Two Sorted Lists
    LeetCode Top 100高頻算法題,即LeetCode上最高頻的100道求職面試算法題
  • LeetCode Top 100 高頻算法題 49. Group Anagrams
    由於公眾號做了改版,為了保證公眾號的文章可以準時推送到你手裡,大家記得點擊上方藍色」菜鳥名企夢「,將咱們的公眾號 加星標置頂 ,在此真誠的表示感謝~LeetCode Top 100高頻算法題,即LeetCode上最高頻的100道求職面試算法題。
  • LeetCode Top 100 高頻算法題 05:Longest Palindromic Substring
    LeetCode Top 100高頻算法題,即LeetCode上最高頻的100道求職面試算法題
  • LeetCode Top 100 高頻算法題45. Jump Game II
    由於公眾號做了改版,為了保證公眾號的文章可以準時推送到你手裡,大家記得點擊上方藍色」菜鳥名企夢「,將咱們的公眾號 加星標置頂 ,在此真誠的表示感謝~LeetCode Top 100高頻算法題,即LeetCode上最高頻的100道求職面試算法題。
  • LeetCode Top 100 高頻算法題 03:Longest Substring
    LeetCode Top 100高頻算法題,即LeetCode上最高頻的100道求職面試算法題。
  • 「Spring 全家桶」70 道高頻面試題
    這裡說「天方夜譚」並不是說算法沒用,不切實際,而是想說算法平時其實很少用到,甚至面試官都對自己出的算法題一知半解。這裡總結了 70 道 Spring 相關面試題,有的很基礎,有的很細節,大家可以評估一下自己掌握的情況。
  • LeetCode Top 100 高頻算法題 04:Median of Two Sorted Arrays
    LeetCode Top 100高頻算法題,即LeetCode上最高頻的100道求職面試算法題
  • 被這10道Java面試題虐哭了
    整整 10 道 Java 面試題,小王一道也沒答正確。他沮喪地給我說,「哥,說點我的情況,你願意聽嗎?我和一個女孩相處,女孩大我兩歲,我非科班。本來打算國慶換一家薪水高點的,好確認關係。借這個機會,我就把小王遇到的這 10 道面試題分享出來,希望能對其他小夥伴一些幫助。
  • 「秒殺」面試官,你只差這10道Python面試題
    胡陽老師就要來了,趕緊先看看這 10 道面試題。☟PEP 8 是什麼?Python 之禪(import this)是什麼?Python 常用的容器類型有哪些以及它們之間的差別?解釋下閉包是什麼,以及日常中什麼場景會用到?GIL 是什麼?它的影響和具體原理是什麼?
  • 面試-手撕代碼(2)
    以下是手撕代碼系列的第二篇,謹獻給大家,望和大家共同進步。十 手寫Array.prototype.map在寫map之前,我們可以先來看一個經典的面試題。['1', '2', '3'].map(parseInt) what & why ?不賣關子,這個面試題的答案是[1, NaN, NaN]。為什麼呢?
  • LeetCode Top 100 高頻算法題 15. 3Sum
    LeetCode Top 100高頻算法題,即LeetCode上最高頻的100道求職面試算法題。
  • LeetCode Top 100 高頻算法題 06: 10 Regular Expression Matching
    LeetCode Top 100高頻算法題,即LeetCode上最高頻的100道求職面試算法題
  • LeetCode Top 100 高頻算法題 33. Search in Rotated Sorted Array
    ,即LeetCode上最高頻的100道求職面試算法題。小編和實驗室同學之前面試找工作,也只刷了劍指offer和這top 100算法題,在實際面試中也遇到了很多LeetCode上的原題。劍指offer算法最優解之前和大家分享了,LeetCode Top 100這100道算法題,每道題小編都刷了很多遍,並且總結了一種最適合面試時手撕算法的最優解法。後續每天和大家分享一道LeetCode top 100高頻算法題,以及小編總結的最優解法。
  • LeetCode Top 100 高頻算法題 07:11. Container With Most Water
    LeetCode Top 100高頻算法題,即LeetCode上最高頻的100道求職面試算法題
  • 10年+技術總監面FB,面試官竟然讓我寫算法題?
    FB面試要求coding,連10年+經驗的技術總監也不例外!前幾天,一位學員在群裡分享面經時說到。還好有《九章算法班》,這門金牌算法課,高度針對FLAG級別大廠面試,緊跟最新面試動態每年升級課程和題庫。