1. 程式人生 > >第一次面試小記

第一次面試小記

第一次面試小記

昨天去上海蔘加了一家公司面試,面試的是爬蟲崗。下面我就記錄一下遇到的問題。問題先後順序按想到哪個寫哪個。

1.多執行緒

程序是程式執行的最小單元,每個程序都有自己獨立的記憶體空間,而執行緒是程序的一個實體,是系統呼叫的一個基本單位。

當我們啟動一個app的時候這就建立了一個程序,這個app裡可能有語音播放、搜尋等功能,這就是程序裡不同的執行緒。執行緒是輕量級的,他沒有獨立的空間地址(記憶體空間),因為他是由程序建立的,寄存在程序的記憶體地址中。一個程序會包含多個執行緒。執行緒有5中狀態(新建狀態、就緒狀態、執行狀態、阻塞狀態、死亡狀態)下面是一個簡單的多執行緒程式碼:

import threading
import time
def my_thread(threadName):
    time.sleep(1)
    print('執行緒:' + str(threadName)+'正在執行')
    print('hello')
if __name__ == '__main__':
    for i in range(4):
        t = threading.Thread(target=my_thread,args=(i,))
        t.start()

可以看到結果是雜亂無序的,這就是多執行緒在互相搶佔資源,造成輸出的順序不同。下面我會提供一個多執行緒爬蟲例子。

2.快速排序

參考連結:https://cuijiahua.com/blog/2017/12/algorithm_4.html

面試官隨機提的一個數據結構題目,很遺憾沒答出來,也是平時刷的不夠多。在此我貼一下程式碼。

def QuickSort(input_list, left, right):
    def division(input_list, left, right):
        base = input_list[left]
        while left < right:
            while left < right and input_list[right] >= base:
               right -= 1
            input_list[left] = input_list[right]
            while left < right and input_list[left] <= base:
               left += 1
            input_list[right] = input_list[left]
        input_list[left] = base
        return  left
    if left < right:
        base_index = division(input_list,left,right)
        QuickSort(input_list,left,base_index-1)
        QuickSort(input_list,base_index+1,right)
if __name__ == '__main__':
    input_list = [7,4,8,2,4,8,1,0]
    print('排序前:',input_list)
    QuickSort(input_list,0,len(input_list)-1)
    print('排序後:',input_list)

演算法流程圖如下:

上圖中,演示了快速排序的處理過程:

初始狀態為一組無序的陣列:2、4、5、1、3。

經過以上操作步驟後,完成了第一次的排序,得到新的陣列:1、2、5、4、3。

新的陣列中,以2為分割點,左邊都是比2小的數,右邊都是比2大的數。

因為2已經在陣列中找到了合適的位置,所以不用再動。

2左邊的陣列只有一個元素1,所以顯然不用再排序,位置也被確定。(注:這種情況時,left指標和right指標顯然是重合的。因此在程式碼中,我們可以通過設定判定條件left必須小於right,如果不滿足,則不用排序了)。

而對於2右邊的陣列5、4、3,設定left指向5,right指向3,開始繼續重複圖中的一、二、三、四步驟,對新的陣列進行排序。

演算法效能如下:

1、快速排序演算法的效能

排序(4):快速排序

2、時間複雜度

當資料有序時,以第一個關鍵字為基準分為兩個子序列,前一個子序列為空,此時執行效率最差。

而當資料隨機分佈時,以第一個關鍵字為基準分為兩個子序列,兩個子序列的元素個數接近相等,此時執行效率最好。

所以,資料越隨機分佈時,快速排序效能越好;資料越接近有序,快速排序效能越差。

3、時間複雜度

快速排序在每次分割的過程中,需要 1 個空間儲存基準值。而快速排序的大概需要 NlogN次的分割處理,所以佔用空間也是 NlogN 個。

4、演算法穩定性

在快速排序中,相等元素可能會因為分割槽而交換順序,所以它是不穩定的演算法。

3.SQL,NoSQL

本科雖然學過資料庫這門課,但是後來就沒有用過了,所以對資料庫可以說完全不瞭解。面試的時候也聞到了,在此總結一下。
SQL(Structured Query Language)資料庫,指關係型資料庫,主要代表:SQL Sever,Oracle,MySQL(開源),PostgreSQL(開源)。NoSQL(Not Only SQL)泛指非關係型資料庫。主要代表:MongoDB,Redis,CouchDB。

SQL資料存在特定結構的表中;而NoSQL則更加靈活和可擴充套件,儲存方式可以省是JSON文件、雜湊表或者其他方式。SQL通常以資料庫表形式儲存資料。舉個栗子,存個學生借書資料:

而NoSQL儲存方式比較靈活,比如使用類JSON檔案儲存上表中熊大的借閱資料:

4.Python2和3的區別

1.print 函式

print語句沒有了,取而代之的是print()函式。

2.除法運算

python2.x整數相除得整數,浮點數相除得浮點數,python3.x整數相除也會得到浮點數

3.range和xrange

range返回的是一個list物件,而xrange返回的是一個生成器物件(xrange object)。

.xrange則不會直接生成一個list,而是每次呼叫返回其中的一個值,記憶體空間使用極少,因而效能非常好

4.不等運算子

Python 2.x中不等於有兩種寫法 != 和 <>

Python 3.x中去掉了<>, 只有!=一種寫法