AI筆試面試題庫-Python題目解析4

七月線上實驗室發表於2018-07-02

為方便大家及時檢視和學習AI相關課程的筆試和麵試題目,小七會在公眾號上陸續釋出七月線上官網的題庫試題帶解析,歡迎大家及時溝通學習,有紕漏的地方也請大家及時指正,我們會逐漸完善題庫資訊,給大家提供更多更好的試題資源


官網連結:

https://www.julyedu.com/question/big/kp_id/28/ques_id/928


1、請用Python手寫實現插入排序。

解析:

插入排序(Insertion Sort)的工作原理是通過構建有序序列,對於未排序資料,
在已排序序列中從後向前掃描,找到相應位置並插入。 演算法執行步驟: (1)從第一個元素開始,該元素可以認為已經被排序; (2)取出下一個元素,在已經排序的元素序列中從後向前掃描; (3)如果被掃描的元素(已排序)大於新元素,則將被掃描元素後移一位; (4)重複步驟(3),直到找到已排序的元素小於或者等於新元素的位置; (5)將新元素插入到該位置後; (6)重複步驟(2)-(5)。

640?wx_fmt=gif

Python實現 def insert_sort(ary):    n = len(ary)    for i in range(1,n):        if ary[i] < ary[i-1]:            temp = ary[i]            #待插入的下標            index = i                      #從i-1 迴圈到 0 (包括0)            for j in range(i-1,-1,-1):                  if ary[j] > temp :                    ary[j+1] = ary[j]                    #記錄待插入下標                    index = j                  else :                    break            ary[index] = temp    return ary


2、請用Python手寫實現快速排序。

解析:

步驟: (1)從數列中挑出一個元素,稱為 “基準”(pivot); (2)重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值
   大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基
   準就處於數列的中間位置。這個稱為分割槽(partition)操作; (3)遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。 換言之 快速排序時基於分治模式處理的, 對一個典型子陣列A[p...r]排序的分治過程為三個步驟: (1)分解: A[p..r]被劃分為倆個(可能空)的子陣列A[p ..q-1]和A[q+1 ..r],使得 A[p ..q-1] <= A[q] <= A[q+1 ..r]; (2)解決:通過遞迴呼叫快速排序,對子陣列A[p ..q-1]和A[q+1 ..r]排序; (3)合併。 QUICKSORT(A, p, r) 1 if p < r 2    then q ← PARTITION(A, p, r)   //關鍵 3         QUICKSORT(A, p, q - 1) 4         QUICKSORT(A, q + 1, r) 陣列劃分 快速排序演算法的關鍵是PARTITION過程,它對A[p..r]進行就地重排: PARTITION(A, p, r) 1  x ← A[r] 2  i ← p - 1 3  for j ← p to r - 1 4       do if A[j] ≤ x 5             then i ← i + 1 6                  exchange A[i] <-> A[j] 7  exchange A[i + 1] <-> A[r] 8  return i + 1 下圖是一個例子  
640?wx_fmt=gif

這是另外一個視覺化圖
640?wx_fmt=gif

Python實現 def quick_sort(ary):    return qsort(ary,0,len(ary)-1) def qsort(ary,left,right):    #快排函式,ary為待排序陣列,left為待排序的左邊界,right為右邊界    if left >= right : return ary    key = ary[left]     #取最左邊的為基準數    lp = left           #左指標    rp = right          #右指標    while lp < rp :        while ary[rp] >= key and lp < rp :            rp -= 1        while ary[lp] <= key and lp < rp :            lp += 1        ary[lp],ary[rp] = ary[rp],ary[lp]    ary[left],ary[lp] = ary[lp],ary[left]    qsort(ary,left,lp-1)    qsort(ary,rp+1,right)    return ary


3、請用Python手寫實現堆排序。

解析:

堆排序在 top K 問題中使用比較頻繁。堆排序是採用二叉堆的資料結構來
實現的,雖然實質上還是一維陣列。二叉堆是一個近似完全二叉樹 。 二叉堆具有以下性質: 父節點的鍵值總是大於或等於(小於或等於)任何一個子節點的鍵值。 每個節點的左右子樹都是一個二叉堆(都是最大堆或最小堆)。 步驟: (1)構造最大堆(Build_Max_Heap):若陣列下標範圍為0~n,考慮到單獨一個
    元素是大根堆,則從下標n/2開始的元素均為大根堆。於是只要從n/2-1開
    始,向前依次構造大根堆,這樣就能保證,構造到某個節點時,它的左右
    子樹都已經是大根堆。 (2)堆排序(HeapSort):由於堆是用陣列模擬的。得到一個大根堆後,陣列
    內部並不是有序的。因此需要將堆化陣列有序化。思想是移除根節點,並
    做最大堆調整的遞迴運算。第一次將heap[0]與heap[n-1]交換,再對
    heap[0...n-2]做最大堆調整。第二次將heap[0]與heap[n-2]交換,
    再對heap[0...n-3]做最大堆調整。重複該操作直至heap[0]和heap[1]
    交換。由於每次都是將最大的數併入到後面的有序區間,故操作完後
    整個陣列就是有序的了。 (3)最大堆調整(Max_Heapify):該方法是提供給上述兩個過程呼叫的。
    目的是將堆的末端子節點作調整,使得子節點永遠小於父節點。
   
640?wx_fmt=gif

Python實現
def heap_sort(ary) :    n = len(ary)    #最後一個非葉子節點    first = int(n/2-1)          #構造大根堆    for start in range(first,-1,-1) :            max_heapify(ary,start,n-1)    #堆排,將大根堆轉換成有序陣列    for end in range(n-1,0,-1):                  ary[end],ary[0] = ary[0],ary[end]        max_heapify(ary,0,end-1)    return ary #最大堆調整:將堆的末端子節點作調整,使得子節點永遠小於父節點 #start為當前需要調整最大堆的位置,end為調整邊界 def max_heapify(ary,start,end):    root = start    while True :        #調整節點的子節點        child = root*2 +1                      if child > end : break        if child+1 <= end and ary[child] < ary[child+1] :            #取較大的子節點            child = child+1        #較大的子節點成為父節點                    if ary[root] < ary[child] :                #交換            ary[root],ary[child] = ary[child],ary[root]                root = child        else :            break


4、請用Python手寫實現歸併排序。

解析:

歸併排序是採用分治法的一個非常典型的應用。歸併排序的思想就是先遞迴
分解陣列,再合併陣列。 先考慮合併兩個有序陣列,基本思路是比較兩個陣列的最前面的數,誰小就
先取誰,取了後相應的指標就往後移一位。然後再比較,直至一個陣列為空,
最後把另一個陣列的剩餘部分複製過來即可。 再考慮遞迴分解,基本思路是將陣列分解成left和right,如果這兩個陣列
內部資料是有序的,那麼就可以用上面合併陣列的方法將這兩個陣列合並排
序。如何讓這兩個陣列內部是有序的?可以再二分,直至分解出的小組只含
有一個元素時為止,此時認為該小組內部已有序。然後合併排序相鄰二個小
組即可。

640?wx_fmt=gif
Python實現 def merge_sort(ary):    if len(ary) <= 1 : return ary    num = int(len(ary)/2)       #二分分解    left = merge_sort(ary[:num])    right = merge_sort(ary[num:])    return merge(left,right)    #合併陣列 def merge(left,right):    '''合併操作,    將兩個有序陣列left[]和right[]合併成一個大的有序陣列'''    #left與right陣列的下標指標    l,r = 0,0              result = []    while l


5、請建立一個函式檢查一個詞是否具有迴文結構,使用 Python 進行編寫。

解析:

def huiwen(str): if len(str)==1: return True else: return str[0]==str[-1] and huiwen(str[1:-1])

640?wx_fmt=gif

為了讓大家順利轉行AI相關崗位,七月線上特意推出機器學習集訓營課程,迄今為止,「機器學習集訓營」已經舉辦了四期,每一期都湧現出了不少優秀offer,特別是上一期很多同學從Java、Android、iOS等傳統IT行業成功轉崗AI拿到年薪三四十萬,部分甚至超過四十萬拿到五十萬。


本第五期,在第四期的基礎上,除了繼續維持“入學測評、直播答疑、佈置作業、階段考試、畢業考核、一對一批改、線上線下結合、CPU&GPU雙雲平臺、面試輔導、就業推薦”十位一體的教學模式,本期特地推出機器學習工程師的聯合認證。且線下在北京、上海、深圳、廣州、杭州、瀋陽、濟南、鄭州、成都的基礎上,新增武漢、西安兩個線下點,十一城同步開營。


現推出特惠價格,2人及2人以上組團報名,可各減500元想組團者請加微信客服:julyedukefu_02。課程詳情可點選 閱讀原文。

掃碼加客服微信

640?wx_fmt=jpeg

640?wx_fmt=gif

640?wx_fmt=jpeg

相關文章