Python2018秋招(筆者親身經歷)

畢業即失業,苦逼的大四狗傷不起喲。java

又到了一年一度的秋招了,筆者也在拉勾,智聯,boss直聘註冊了,投了50份簡歷,3個面試,然而全掛了。python

筆者痛定思痛決定將本身的經歷貼出,但願能夠幫到要面試的同窗。mysql

雨軒戀原創 轉載請註明來源 雨軒戀i - 博客園  http://www.cnblogs.com/yuxuanlian/程序員

 

算法編程題web

1 冒泡排序面試

思想:冒泡排序從小到大排序:一開始交換的區間爲0~N-1,將第1個數和第2個數進行比較,前面大於後面,交換兩個數,不然不交換。再比較第2個數和第三個數,前面大於後面,交換兩個數不然不交換。依次進行,最大的數會放在數組最後的位置。而後將範圍變爲0~N-2,數組第二大的數會放在數組倒數第二的位置。依次進行整個交換過程,最後範圍只剩一個數時數組即爲有序。算法

代碼:sql

#交換排序.冒泡排序
L = [1, 3, 2, 32, 5, 4]
def Bubble_sort(L):
    for i in range(len(L)):
        for j in range(i+1,len(L)):
            if L[i]>L[j]:
                # temp = L[j]
                # L[j] = L[i]
                # L[i] = temp
                L[i], L[j] = L[j], L[i]#交換順序

    print (L)
Bubble_sort(L)數據庫

 

2 插入排序django

思想:插入排序從小到大排序:首先位置1上的數和位置0上的數進行比較,若是位置1上的數大於位置0上的數,將位置0上的數向後移一位,將1插入到0位置,不然不處理。位置k上的數和以前的數依次進行比較,若是位置K上的數更大,將以前的數向後移位,最後將位置k上的數插入不知足條件點,反之不處理。

代碼:

#1.直接插入排序
L = [1, 3, 2, 32, 15, 5, 4]
def Insert_sort(L):
    for i in range(1,len(L)):
        for j in range(0,i):#這裏面其實也是從前向後比較
            if L[i]<L[j]:
                L.insert(j,L[i])#在不大於的位置插入L[i],這個時候,列表加長了1,L[i]插入到指定位置了,但它的值也向後移動了一位
                L.pop(i+1)#把原來L[i]的值刪除。
    print(L)
    #空間複雜度爲O1),時間複雜度爲On*n
Insert_sort(L)
# print sorted(L)#自帶的兩種排序
# L.sort()
# print L

 

3 選擇排序

思想:選擇排序從小到大排序:一開始從0~n-1區間上選擇一個最小值,將其放在位置0上,而後在1~n-1範圍上選取最小值放在位置1上。重複過程直到剩下最後一個元素,數組即爲有序。

代碼:

L = [6, 3, 2, 32, 5, 4]
def Select_sort(L):
    for i in range(0,len(L)):
        for j in range(i,len(L)):
            if L[i] > L[j]:         #打擂臺的形式
                # temp = L[i]
                # L[i] = L[j]
                # L[j] = temp
                L[i],L[j] = L[j],L[i]
    return  L
print (Select_sort(L))

 

4 快速排序

思想:快速排序從小到大排序:在數組中隨機選一個數(默認數組首個元素),數組中小於等於此數的放在左邊,大於此數的放在右邊,再對數組兩邊遞歸調用快速排序,重複這個過程。

代碼:

#1.高質量代碼
def quick_sort(lists, left, right):
    # 快速排序
    if left >= right:
        return lists
    key = lists[left]
    low = left
    high = right
    while left < right:
        while left < right and lists[right] >= key:
            right -= 1
        lists[left] = lists[right]
        while left < right and lists[left] <= key:
            left += 1
        lists[right] = lists[left]
    lists[left] = key
    quick_sort(lists, low, left - 1)
    quick_sort(lists, left + 1, high)
    return lists
print (quick_sort(L,0,5))

 

  1. 斐波那契數列

斐波那契數列,又稱黃金分割數列,指的是這樣一個數列:0112358132134、……在數學上,斐波納契數列以以下被以遞歸的方法定義:F0=0F1=1Fn=F(n-1)+F(n-2)

代碼:

#最簡單的方法爲數組,其次爲循環,最垃圾的爲遞歸,到了40就算很久。。往後再琢磨數組
a=[1,1]
def fn(n):
    count=0
    f0=1
    f1=1
    f2=0
    while count<n:
        count+=1
        f2=f1+f0
        f0=f1
        f1=f2
        a.append(f2)
    print('%s項的項數爲:%s'%(b,f2))
    print('斐波那契數列爲:')
    print(a)
b=int(input('請輸入項數:'))
fn(b-2)

 

6 二分法查找

思想:二分查找又稱折半查找,優勢是比較次數少,查找速度快,平均性能好;其缺點是要求待查表爲有序表,且插入刪除困難。 此方法適用於不常常變更而查找頻繁的有序列表。

代碼:

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
find_num = int(input('請輸入一個數字:'))
start = 0
end = len(l) - 1

while True:
    middle = (start + end) // 2
    if find_num == l[middle]:
        print('找到了!索引是:', middle)
        break
    elif find_num > l[middle]:
        start = middle + 1
    elif find_num < l[middle]:
        end = middle - 1
    if start > end:
        print('沒找到!', find_num)
        break

 

7 一個不知道長度的字符串,即很長很長的字符串,求字符串每一個詞的數量

相似a=dkjhagklfh豐¥270997hfjak

代碼:

str='mynameisbobiamfromchina嘿嘿嘿嘿'
str=','.join(str) #以逗號分隔字符串
print(str)
li=str.split(',')
print(li) #變成列表了
#統計每個字符出現的次數:
for i in set(li):
    if li.count(i) >= 1:
        print('%s 出現了%d !'%(i, li.count(i)))

 

8 多重嵌套列表,輸出成一個列表,相似[1,[2[3,4],5],6,7],輸出[1,2,3,4,5,6]

代碼:

l=[1,2,[3,4,[5,6],[7,8],9],10]
l1=[]
#遞歸函數實現:
def getitem(l):
    for item in l:
        if isinstance(item,list):
            getitem(item)
        else:
            print(item)
            l1.append(item)

getitem(l)
print(l1)

 

9 手寫列表逆輸出,[1,2,4,5,3,6]輸出[6,3,5,4,2,1]

代碼:

a=[0,1,2,3,4,5,6,7,8,9,10]
b=[]
print(a[::-1]) #逆輸出

#手寫代碼
count=len(a)
for i in range(len(a),0,-1):
    count-=1
    b.append(a[count])
print(b)

 

10 列表去重,也是不知道長度,[1,2,3,2,3,1,2,3,1,1,1]輸出[1,2,3]

代碼:

ids = [1,2,3,3,4,2,3,4,5,6,1,6,4,3,2,3,]
news_ids = []
for id in ids:
    if id not in news_ids:
        news_ids.append(id)
print (news_ids)

 

11 待續...

 

 

數據庫相關知識

 

1 MySQL數據庫與Oracle數據庫的區別。

1、體積不一樣。

Oracle它體積比較龐大,通常是用來開發大型應用(例如分佈式)的。而MySQL的體積相對來講比較小,較之Oracle更容易安裝、維護以及管理,操做也簡單,最重要的是它是三個中惟一一個開源數據庫,但目前也屬於Oracle公司的產品了。

2、容量不一樣。

Oracle容量無限,根據配置決定;而MySQL使用MyISAM存儲引擎,最大表尺寸爲65536TBMySQL數據庫的最大有效表尺寸一般是由操做系統對文件大小的限制決定的,而不是由MySQL內部限制決定。

3、平臺支持及速度的區別。

Oracle支持大多數平臺;而MySQL支持各類平臺,適合Linux。至於速度,OracleLinux下的性能,在少許數據時速度低於MySQL,在千萬級時速度快於MySQL

4、數據庫崩潰形成的影響不一樣。

Oracle數據庫崩潰後恢復很麻煩,由於他把不少東西放在內存裏;數據庫鏈接要慢些,最好用鏈接池;而MySQL使用缺省的IP端口,可是有時候這些IP也會被一些黑客闖入,使用MyISAM配置,不慎損壞數據庫,結果可能會致使全部的數據丟失。

 

2 MySQL數據庫中查100w條數據和Oracle中查100w條數據的區別。

MySQL數據庫實現分頁比較簡單,提供了 LIMIT函數。通常只須要直接寫到sql語句後面就好了。

LIMIT子 句能夠用來限制由SELECT語句返回過來的數據數量,它有一個或兩個參數,若是給出兩個參數, 第一個參數指定返回的第一行在全部數據中的位置,從0開始(注意不是1),第二個參數指定最多返回行數。例如:

select * from table WHERE LIMIT 10; #返回前10

select * from table WHERE LIMIT 0,10; #返回前10

select * from table WHERE LIMIT 10,20; #返回第10-20行數據

 

ORCALE數據庫實現分頁查詢可使用 row_number()函數或者使用rownum 虛列兩種方法。

第二種方法:直接使用rownum 虛列

select * from

(select t.*,rownum as rowno from TABLE1 )

where rowno between 10 and 20

這兩種方法比較,顯然第二種方法比較好。由於不用order by語句,會提升檢索數據的速度的,尤爲數據量越大時,第二種方法快速檢索數據越明顯。

 

3 SQL注入是什麼。

SQL注入:利用現有應用程序,將(惡意)SQL命令注入到後臺數據庫引擎執行的能力,這是SQL注入的標準釋義。

隨着B/S模式被普遍的應用,用這種模式編寫應用程序的程序員也愈來愈多,但因爲開發人員的水平和經驗良莠不齊,至關一部分的開發人員在編寫代碼的時候,沒有對用戶的輸入數據或者是頁面中所攜帶的信息(如Cookie)進行必要的合法性判斷,致使了攻擊者能夠提交一段數據庫查詢代碼,根據程序返回的結果,得到一些他想獲得的數據。

 

4 數據庫的三範式。

第一範式:確保每列的原子性.

第二範式:在第一範式的基礎上更進一層,目標是確保表中的每列都和主鍵相關.

第三範式:在第二範式的基礎上更進一層,目標是確保每列都和主鍵列直接相關,而不是間接相關.

 

5 什麼是事務,MySQL如何支持事務。

MySQL 事務主要用於處理操做量大,複雜度高的數據。好比說,在人員管理系統中,你刪除一我的員,你即須要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操做語句就構成一個事務!

 

MySQL 中只有使用了 Innodb 數據庫引擎的數據庫或表才支持事務。

事務處理能夠用來維護數據庫的完整性,保證成批的 SQL 語句要麼所有執行,要麼所有不執行。

事務用來管理 insert,update,delete 語句

通常來講,事務是必須知足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。

 

6 MySQL主鍵和外鍵的區別。

主鍵是能肯定一條記錄的惟一標識,好比,一條記錄包括身份正號,姓名,年齡。身份證號是惟一能肯定你這我的的,其餘均可能有重複,因此,身份證號是主鍵

外鍵用於與另外一張表的關聯。是能肯定另外一張表記錄的字段,用於保持數據的一致性。一個表能夠有多個外鍵。

 

 

 

 

7 使用ORM和原生SQL的優缺點。

ORM框架:

    對象關係映射,經過建立一個類,這個類與數據庫的表相對應!類的對象代指數據庫中的一行數據。

簡述ORM原理:

    讓用戶再也不寫SQL語句,而是經過類以及對象的方式,和其內部提供的方法,進行數據庫操做!把用戶輸入的類或對象轉換成SQL語句,轉換以後經過pymysql執行完成數據庫的操做。

ORM的優缺點:

  優勢:

    提升開發效率,下降開發成本

    使開發更加對象化

    可移植

    能夠很方便地引入數據緩存之類的附加功能

  缺點:

    在處理多表聯查、where條件複雜之類的查詢時,ORM的語法會變得複雜。就須要寫入原生SQL

 

8.待續...

 

 

 

 

技能和項目

1 裝飾器的寫法以及應用

#裝飾器的應用場景:好比插入日誌,性能測試,事務處理,緩存等等場景。
def outer(func):
    def inner(*args,**kwargs):
        print("認證成功!")
        result = func(*args,**kwargs)
        print("日誌添加成功")
        return result
    return inner

@outer
def f1(name,age):
    print("%s 正在鏈接業務部門1數據接口......"%name)

# 調用方法
f1("jack",18)
#裝飾器調用方法,實際上是把函數 f1 當成 outer的參數

 

2 生成器的寫法以及應用

#若是列表元素能夠按照某種算法推算出來,那咱們是否能夠在循環的過程當中不斷推算出後續的元素呢?
# 這樣就沒必要建立完整的list,從而節省大量的空間。
# Python中,這種一邊循環一邊計算的機制,稱爲生成器(Generator

def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
fib(8)
#生成器調用方法,實際上是

 

3 HTTP中常見的請求頭

Accept:瀏覽器端能夠接受的媒體類型,通配符 * 表明任意類型

Accept-Encoding:瀏覽器申明本身接收的編碼方法,例如: Accept-Encoding: zh-CN,zh;q=0.8

Accept-Language: 瀏覽器申明本身接收的語言,

Connection: Connection: keep-alive 當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接。

Referer:當瀏覽器向web服務器發送請求的時候,通常會帶上Referer,告訴服務器我是從哪一個頁面連接過來的,服務器籍此能夠得到一些信息用於處理。

User-Agent:告訴HTTP服務器, 客戶端使用的操做系統和瀏覽器的名稱和版本.

CookieCookie是用來存儲一些用戶信息以便讓服務器辨別用戶身份的(大多數須要登陸的網站上面會比較常見),好比cookie會存儲一些用戶的用戶名和密碼,當用戶登陸後就會在客戶端產生一個cookie來存儲相關信息,這樣瀏覽器經過讀取cookie的信息去服務器上驗證並經過後會斷定你是合法用戶,從而容許查看相應網頁。

 

通常爬蟲的代理設置就在User-Agent裏面

 

4 HTTP中常見的狀態碼

1開頭(信息)

       2開頭(成功)

           200OK):請求成功

           202Accepted):已接受請求,還沒有處理

           204No Content):請求成功,且不需返回內容

       3開頭(重定向)

           301Moved Permanently):被請求的資源已永久移動到新位置

           301Moved Temporarily):被請求的資源已臨時移動到新位置

       4開頭(客戶端錯誤)

           400Bad Request):請求的語義或是參數有錯

           403Forbidden):服務器拒絕了請求

           404Not Found):未找到請求的資源

       5開頭(服務器錯誤)

          500Internal Server Error):服務器遇到錯誤,沒法完成請求

          502Bad Getway):網關錯誤,通常是服務器壓力過大致使鏈接超時       

          503Service Unavailable):服務器宕機

 

5 Scrapy如何處理反爬蟲

  1. 隨機user-agent
  2. 添加Referer
  3. 延時處理
  4. 隨機代理ip

 

6 Scrapy爬蟲程序中斷如何繼續

總之咱們要想保證爬取數據的完整就要犧牲程序的效率。

1.把全部爬取過的url列表保存到一個文件當中,而後再次啓動的時候每次爬取要和文件當中的url列表對比,若是相同則再也不爬取。

2.scrapy再次啓動爬取的時候和數據庫裏面的數據作對比,若是相同則不存取。

3.就是利用Request中的優先級(priority

 

7 Flask框架的優點

1、總體設計方面

首先,二者都是很是優秀的框架。總體來說,二者設計的哲學是區別最大的地方。Django提供一站式的解決方案,從模板、ORMSessionAuthentication等等都分配好了,連app劃分都作好了,總之,爲你作儘可能多的事情,並且還有一個killer級的特性,就是它的admin,配合django-suit,後臺就出來了,其實最初Django就是由在新聞發佈公司工做的人設計的。Flask只提供了一些核心功能,很是簡潔優雅。它是一個微框架,其餘的由擴展提供,但它的blueprint使它也可以很方便的進行水平擴展。

2、路由設計

Django的路由設計是採用集中處理的方法,利用正則匹配。Flask也能這麼作,但更多的是使用裝飾器的形式,這個有優勢也有缺點,優勢是讀源碼時看到函數就知道怎麼用的,缺點是一旦源碼比較長,你要查路由就不太方便了,但這也促使你去思考如何更合理的安排代碼。

3、應用模塊化設計

Django的模塊化是集成在命令裏的,也就是說一開始Django的目標就是爲之後玩大了作準備的。每一個都是一個獨立的模塊,爲之後的複用提供了便利。Flask經過Blueprint來提供模塊化,本身對項目結構劃分紅不一樣的模塊進行組織。

4、配置

Django的配置主要仍是靠settings.py來作,固然爲了DevelopmentProduction環境分離,還有一些方法來處理配置。Flask的配置很靈活,有多種方法配置,不一樣環境的配置也很是方便。

 

8 待續...

 

 

 

 

其餘雜項

1 你在學校都學過什麼課程

...數據結構,軟件工程,軟件測試,計算機網絡以及各類語言。。。

2 知道cpypypy

CPython

   Python官方網站下載並安裝好Python2.7後,就直接得到了一個官方版本的解釋器:Cpython,這個解釋器是用C語言開發的,因此叫 CPython,在命名行下運行python,就是啓動CPython解釋器,CPython是使用最廣的Python解釋器。

IPython

  IPython是基於CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所加強,可是執行Python代碼的功能和CPython是徹底同樣的,比如不少國產瀏覽器雖然外觀不一樣,但內核實際上是調用了IE

PyPy

  PyPy是另外一個Python解釋器,它的目標是執行速度,PyPy採用JIT技術,對Python代碼進行動態編譯,因此能夠顯著提升Python代碼的執行速度。

 

3 週末有什麼打算

...做爲一名肥宅,我只想在宿舍腐爛

4 平時熬夜麼

...不熬夜啊,只是修仙而已

5 爲何學習Python

...人生苦短,我用Python

6 你老家是山西的,你想在北京發展嗎

...不打算在北京發展,爲何我要投北京公司的簡歷

7 你還有什麼問題要問個人嗎

...爲何HR問的問題都這麼千奇百怪

8 在學校的英語和數學怎麼樣

...只聽過雅蠛蝶和爲何1+1=2

9 除了語言課,你在學校在哪一方面的專業課比較好

...LOL嗎,我亞索賊6

10 能說說瀑布模型開發嗎

...制定計劃、需求分析、軟件設計、程序編寫、軟件測試和運行維護等六個基本活動

11 什麼是OOP,即面向對象編程思想

...OOP,不就是OPPO Find X 你值得擁有

12 若是你學的Python,忽然有個小項目須要用到java,你會怎麼作

...我選擇刪除數據庫,而後跑路

13 待續...

 

以上的題就隨緣發揮吧。。。

相關文章
相關標籤/搜索