2019年秋招2020屆。主要考慮python研發崗位和後端崗位。
因為許多原因放棄考研,我是半路九月底才開始準備的面試,花了一個月的時間,我個人不算優秀吧,在網路上就算個最差的,估計。
offer有了四五個,從9k-15k都有
都是杭州的公司,我是很喜歡去杭州的那種人
最高的15k還是一家搞電商平臺給的,感覺自己不是很喜歡也不是很熱門。
現在頁找到了12k的,資料處理的一家公司搞python開發的在杭州。
我個人的技術就很多都是和python相關的,但是大二大三搞專案多些,那時候沒注意培養自己的演算法。
大小公司都有,畢竟技術棧深入的部分還是在專案開發,而不是在演算法。所以工作很難找。
110道python面試真題:https://zhuanlan.zhihu.com/p/54430650
後端面試題總彙:https://github.com/yongxinz/back-end-inter...
python_developer:https://github.com/xiandong79/Python_Devel...
各個排序演算法圖解https://blog.csdn.net/qq_37941471/article/...
刷***面經
武漢森果_面試總結
-
介紹一下自己,以及自己做過的專案?
-
django的元件是什麼?https://www.cnblogs.com/chongdongxiaoyu/p/...第九題
- django:內部元件
-
Admin元件,是對model中對應的資料表進行增刪改查提供的元件
-
model元件:負責運算元據庫
-
form元件:1.生成HTML程式碼2.資料有效性校驗3校驗資訊返回並展示
-
ModelForm元件即用於資料庫操作,也可用於使用者請求的驗證
-
django如何和資料庫進行連結的?應該是orm!https://zhuanlan.zhihu.com/p/54430650第三十八題
-
ORM,全拼Object-Relation Mapping,意為物件-關係對映
實現了資料模型與資料庫的解耦,透過簡單的配置就可以輕鬆更換資料庫,而不需要修改程式碼只需要物件導向程式設計,orm操作本質上會根據對接的資料庫引擎,翻譯成對應的sql語句,所有使用Django開發的專案無需關心程式底層使用的是MySQL、Oracle、sqlite....,如果資料庫遷移,只需要更換Django的資料庫引擎即可
-
-
三次握手/四次揮手?https://blog.csdn.net/whuslei/article/deta...
-
三次握手:首先Client端傳送連線請求報文,Server段接受連線後回覆ACK報文,併為這次連線分配資源。Client端接收到ACK報文後也向Server段發生ACK報文,並分配資源,這樣TCP連線就建立了。
-
假設Client端發起中斷連線請求,也就是傳送FIN報文。Server端接到FIN報文後,意思是說"我Client端沒有資料要發給你了",但是如果你還有資料沒有傳送完成,則不必急著關閉Socket,可以繼續傳送資料。所以你先傳送ACK,"告訴Client端,你的請求我收到了,但是我還沒準備好,請繼續你等我的訊息"。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。當Server端確定資料已傳送完成,則向Client端傳送FIN報文,"告訴Client端,好了,我這邊資料發完了,準備好關閉連線了"。Client端收到FIN報文後,"就知道可以關閉連線了,但是他還是不相信網路,怕Server端不知道要關閉,所以傳送ACK後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。“,Server端收到ACK後,"就知道可以斷開連線了"。Client端等待了2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,我Client端也可以關閉連線了。Ok,TCP連線就這樣關閉了!
-
建立連線(三次握手):
第一次:Client----------SYN------------->Server
第二次:Server---------(ACK+SYN)------------------>Client
第三次:Client-----------ACK------------------------>Server
斷開連線(四次揮手)
第一次:Client--------------FIN--------------------->Server
伺服器讀通道關閉
第二次:Server-------------ACK--------------------->Client
客戶機寫通道關閉
第三次:Server-------------FIN---------------------->Client
客戶機讀通道關閉
第四次:Client--------------ACK--------------------->Server伺服器寫通道關閉
-
-
tcp?udp?http?ip屬於哪些層?作用?https://blog.csdn.net/qq_22238021/article/...
-
物理層:
物理層的任務就是透明地傳送位元流。物理層還要確定連線電纜插頭的定義及連線法。
資料鏈路層:資料鏈路層的任務是在兩個相鄰結點間的線路上無差錯地傳送以幀為單位的資料。每一幀包括資料和必要的控制資訊。
網路層:網路層的任務就是要選擇合適的路由,使傳送站的運輸層所傳下來的分組能夠正確無誤地按照地址找到目的站,並交付給目的站的運輸層。
運輸層:運輸層的任務是向上一層的進行通訊的兩個程式之間提供一個可靠的端到端服務,使它們看不見運輸層以下的資料通訊的細節。
應用層:應用層直接為使用者的應用程式提供服務。
-
TCP與UDP基本區別
1.基於連線與無連線
2.TCP要求系統資源較多,UDP較少;
3.UDP程式結構較簡單
4.流模式(TCP)與資料包模式(UDP);
5.TCP保證資料正確性,UDP可能丟包
6.TCP保證資料順序,UDP不保證
-
TCP具體是透過怎樣的方式來保證資料的順序化傳輸、可靠傳輸呢?
-
保證順序化:
主機每次傳送資料時,TCP就給每個資料包分配一個序列號並且在一個特定的時間內等待接收主機對分配的這個序列號進行確認,如果傳送主機在一個特定時間內沒有收到接收主機的確認,則傳送主機會重傳此資料包。接收主機利用序列號對接收的資料進行確認,以便檢測對方傳送的資料是否有丟失或者亂序等,接收主機一旦收到已經順序化的資料,它就將這些資料按正確的順序重組成資料流並傳遞到高層進行處理。
(1)為了保證資料包的可靠傳遞,傳送方必須把已傳送的資料包保留在緩衝區;
(2)併為每個已傳送的資料包啟動一個超時定時器;
(3)如在定時器超時之前收到了對方發來的應答資訊(可能是對本包的應答,也可以是對本包後續包的應答),則釋放該資料包占用的緩衝區;
(4)否則,重傳該資料包,直到收到應答或重傳次數超過規定的最大次數為止。
(5)接收方收到資料包後,先進行CRC校驗,如果正確則把資料交給上層協議,然後給傳送方傳送一個累計應答包,表明該資料已收到,如果接收方正好也有資料要發給傳送方,應答包也可方在資料包中捎帶過去。
-
TCP透過以下幾種方式來提供可靠性:
(1)、應用資料被分割為 TCP 認為最合適傳送的資料塊。這和 UDP
完全不同,應用程式產生的資料包的長度將保持不變。(將資料截為合理的長度)
(2)、當TCP發出一個段後,它啟動一個定時器,等待目的端的確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。(超時重傳)
(3)、當TCP收到發自TCP連線另一端的資料,它將傳送一個確認。這個確認不是立即傳送,通常將推遲幾分之一秒。(對於收到的請求,給出確認響應)(之所以推遲,可能是要對包做完整校驗)
(4)、TCP將保持它首部和資料的校驗和。這是一個端到端的校驗和,目的是檢測資料在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP將丟棄這個報文段和不確認收到此報文段。(校驗出包有錯,丟棄報文段,不給出響應,TCP傳送資料段,超時會重發資料)。
(5)、既然 TCP 報文段作為 IP 資料包來傳輸,而 IP
資料包的到達可能會失序,因此TCP報文段的到達可能也會失序。如果必要的話,TCP將對收到的資料進行重新排序,將收到的資料以正確的順序交給應用層。(對失序資料進行重新排序,然後才交給應用層)。
(6)、既然 IP 資料包會發生重複,TCP
的接收端必須丟棄重複的資料(對於重複資料,能夠丟棄重複資料)。
(7)、TCP 能夠提供流量控制。TCP
連線的每一方都有固定大小的緩衝空間。TCP
的接收端只允許另一端傳送接收緩衝區所能接納的資料。這將防止較快主機導致較慢主機的緩衝區溢位。(TCP
可以進行流量控制,防止較快主機致使較慢主機緩衝區溢位)。TCP
使用的流量控制協議是可變大小的滑動視窗協議。
位元組流服務:兩個應用程式透過 TCP 連線交換 8 bit
位元組構成的位元組流。TCP
不再位元組流中插入記錄識別符號。我們將這成為位元組流服務。
TCP對位元組流的內容不作任何解釋::
TCP對位元組流的內容不作任何解釋。TCP不知道傳輸的資料位元組流是二進位制資料,還是ASCII字元、EBCDIC字元或者其他型別資料。對位元組流的解釋由TCP連線雙方的應用層解釋。
-
-
python中可變資料型別和不可變資料型別?https://zhuanlan.zhihu.com/p/54430650第二十一題
-
不可變資料型別:數值型、字串型string和元組tuple
-
可變資料型別:列表list和字典dict;
如何讓一個list變為空,很大的list?我回答的是將list的長度設為0,然後還要回答一個。
資料庫型別有哪些?https://blog.csdn.net/op_zoro/article/deta...
-
非關聯式資料庫可以做什麼?其中關聯式資料庫不可以嗎?為什麼?非關聯式資料庫和關聯式資料庫的區別。https://blog.csdn.net/flyingshadower/artic...
-
一、關係型資料庫
關係型資料庫最典型的資料結構是表,由二維表及其之間的聯絡所組成的一個資料組織
優點:
1、易於維護:都是使用表結構,格式一致;
2、使用方便:SQL語言通用,可用於複雜查詢;
3、複雜操作:支援SQL,可用於一個表以及多個表之間非常複雜的查詢。
缺點:
1、讀寫效能比較差,尤其是海量資料的高效率讀寫;
2、固定的表結構,靈活度稍欠;
3、高併發讀寫需求,傳統關係型資料庫來說,硬碟I/O是一個很大的瓶頸。
二、非關係型資料庫
非關係型資料庫嚴格上不是一種資料庫,應該是一種資料結構化儲存方法的集合,可以是文件或者鍵值對等。
優點:
1、格式靈活:儲存資料的格式可以是key,value形式、文件形式、圖片形式等等,文件形式、圖片形式等等,使用靈活,應用場景廣泛,而關係型資料庫則只支援基礎型別。
2、速度快:nosql可以使用硬碟或者隨機儲存器作為載體,而關係型資料庫只能使用硬碟;
3、高擴充套件性;
4、成本低:nosql資料庫部署簡單,基本都是開源軟體。
缺點:
1、不提供sql支援,學習和使用成本較高;
2、無事務處理;
3、資料結構相對複雜,複雜查詢方面稍欠。
非關係型資料庫的分類和比較:
1、文件型
2、key-value型
3、列式資料庫
4、圖形資料庫
-
-
用過哪些python包?os、sys、numpy、markdown、math、datetime等等
位元組跳動一面面經總結
-
介紹一下自己,以及自己做過的專案?
-
介紹一下django專案的整體架構、實現的過程、資料在上面傳輸的過程?
-
django你還了解多少?https://github.com/xiandong79/Python_Devel...
-
輸入url之後顯示的網頁的全過程?https://blog.csdn.net/qq_21993785/article/...
-
域名伺服器dns解析url:
-
瀏覽器搜尋自己的DNS快取(維護一張域名與IP地址的對應表)
若沒有,則搜尋作業系統中的DNS快取(維護一張域名與IP地址的對應表)
若沒有,則搜尋作業系統的hosts檔案(Windows環境下,維護一張域名與IP地址的對應表,位置一般在
C:WindowsSystem32driversetchosts)
若沒有,則作業系統將域名傳送至 本地域名伺服器-
-(遞迴查詢方式),本地域名伺服器
查詢自己的DNS快取,查詢成功則返回結果,否則,(以下是迭代查詢方式)
4.1 本地域名伺服器
向根域名伺服器(其雖然沒有每個域名的具體資訊,但儲存了負責每個域,如com、net、org等的解析的頂級域名伺服器的地址)發起請求,此處,根域名伺服器返回com域的頂級域名伺服器的地址
4.2 本地域名伺服器
向com域的頂級域名伺服器發起請求,返回baidu.com許可權域名伺服器(許可權域名伺服器,用來儲存該區中的所有主機域名到IP地址的對映)地址
4.3 本地域名伺服器 向baidu.com許可權域名伺服器發起請求,得到www.baidu.com的IP地址
本地域名伺服器
將得到的IP地址返回給作業系統,同時自己也將IP地址快取起來
作業系統將 IP 地址返回給瀏覽器,同時自己也將IP地址快取起來
-
三次握手
-
建立tcp連結併傳送http請求
-
伺服器收到請求並相應http請求
-
1.負載均衡
網站可能會有負載均衡裝置來平均分配所有使用者的請求。即對工作任務進行平衡,分
攤到多個操作單元上執行,如圖片伺服器,應用伺服器等。
2請求處理閱讀請求及它的引數和 cookies
-
瀏覽器解析html程式碼並請求程式碼中的資源
-
斷開tcp連結,四次揮手
-
瀏覽器對頁面渲染呈現給使用者
-
-
輸入url之後顯示的網頁的全過程?以及詳細的如何實現的?-----我只回答了大概的概念,細緻的問我我全不知道了。卒!
-
域名解析的過程?
- 如上
-
三次握手/四次握手的過程?
-
為什麼要三次握手和四次揮手?
-
透過第一次握手,B知道A能夠傳送資料。透過第二次握手,A知道B能傳送資料。結合第一次握手和第二次握手,A知道B能接收資料。結合第三次握手,B知道A能夠接收資料。
至此,完成了握手過程,A知道B能收能發,B知道A能收能發,通訊連線至此建立。三次連線是保證可靠的最小握手次數,再多次握手也不能提高通訊成功的機率,反而浪費資源。
-
B收到確認訊號,斷開連線,而A在一段時間內沒收到B的訊號,表明B已經斷開了,於是A也斷開了連線。至此,完成揮手過程。
可能有捧油會問,為什麼2、3次揮手不能合在一次揮手中?那是因為此時A雖然不再傳送資料了,但是還可以接收資料,B可能還有資料要傳送給A,所以兩次揮手不能合併為一次。
揮手次數比握手多一次,是因為握手過程,通訊只需要處理連線。而揮手過程,通訊需要處理資料+連線。
-
-
資料在tcp/udp網路上傳輸是如何實現可靠的?
- 如上
-
伺服器上為什麼要進行反向代理?不進行反向代理外面訪問埠就不能訪問了嗎?
-
不是的,首先。nginx反向代理可以降低上游伺服器的負載
-
一般來說公網延遲高,客戶端與nginx之間的請求連線走公網,nginx先把這些請求快取住,等這些請求資料全部完成之後nginx再向內網伺服器請求,降低公網網路延遲成本,同時也降低一個連線佔用服務端程式的時間。
原因:因為tcp不一定一次就能把全部資料傳輸完畢,所以一個連線可能需要等待很久才能把所有需要的資料都傳輸完畢,而這樣的空閒連線如果都直接連線到伺服器上的話,會加重伺服器負擔,而nginx在這方面做了很大的最佳化,可以承載更多的連線,空閒連線也不會佔據太多記憶體,所以nginx作為反向代理能降低上游伺服器的負載。
-
-
get/post區別?
-
GET請求的資料會附在URL之後、GET方式提交的資料最多隻能是1024位元組",因為GET是透過URL提交資料,那麼GET可提交的資料量就跟URL的長度有直接關係了。而實際上,URL不存在引數上限的問題,HTTP協議規範沒有對URL長度進行限制。這個限制是特定的瀏覽器及伺服器對它的限制。
-
理論上講,POST是沒有大小限制的,HTTP協議規範也沒有進行大小限制
POST的安全性要比GET的安全性高。
-
注意:這裡所說的安全性和上面GET提到的“安全”不是同個概念。
-
上面“安全”的含義僅僅是不作資料修改,而這裡安全的含義是真正的Security的含義,比如:透過GET提交資料,使用者名稱和密碼將明文出現在URL上,因為(1)登入頁面有可能被瀏覽器快取,(2)其他人檢視瀏覽器的歷史紀錄,那麼別人就可以拿到你的賬號和密碼了,除此之外,使用GET提交資料還可能會造成Cross-site
request forgery攻擊。
-
get是向伺服器發索取資料的一種請求,而Post是向伺服器提交資料的一種請求,在FORM(表單)中,Method預設為"GET",實質上,GET和POST只是傳送機制不同,並不是一個取一個發!
-
-
nginx作用?誰來做監聽?
-
反向代理
正向代理:某些情況下,代理我們使用者去訪問伺服器,需要使用者手動的設定代理伺服器的ip和埠號。
反向代理:是用來代理伺服器的,代理我們要訪問的目標伺服器。
代理伺服器接受請求,然後將請求轉發給內部網路的伺服器(叢集化),
並將從伺服器上得到的結果返回給客戶端,此時代理伺服器對外就表現為一個伺服器。
Nginx在反向代理上,提供靈活的功能,可以根據不同的正則採用不同的轉發策略,如圖設定好後不同的請求就可以走不同的伺服器。
-
負載均衡
-
負載均衡:多在高併發情況下需要使用。其原理就是將資料流量分攤到多個伺服器執行,減輕每臺伺服器的壓力,多臺伺服器(叢集)共同完成工作任務,從而提高了資料的吞吐量。
-
Nginx可使用的負載均衡策略有:輪詢(預設)、權重、ip_hash、url_hash(第三方)、fair(第三方)
-
動靜分離
Nginx提供的動靜分離是指把動態請求和靜態請求分離開,合適的伺服器處理相應的請求,使整個伺服器系統的效能、效率更高。
Nginx可以根據配置對不同的請求做不同轉發,這是動態分離的基礎。靜態請求對應的靜態資源可以直接放在Nginx上做緩衝,更好的做法是放在相應的緩衝伺服器上。動態請求由相應的後端伺服器處理。
-
-
nginx還了解多少?
-
裝飾器的作用?
- 比如有一個函式func(a, b),它的功能是求a,b的差值,我現在有一個需求,就是想對函式功能再裝飾下,求完差值後再取絕對值,但是不能在func函式內部實現,這時候就需要裝飾器函式了,比如func decorate(func)函式,將func函式作為引數傳遞給decorate函式,由decorate來豐富func函式,豐富完成後再返回給func,此時func的功能就豐富了。
-
程式和執行緒?兩個的區別?
-
程式:
1、作業系統進行資源分配和排程的基本單位,多個程式之間相互獨立
2、穩定性好,如果一個程式崩潰,不影響其他程式,但是程式消耗資源大,開啟的程式數量有限制
執行緒:
1、CPU進行資源分配和排程的基本單位,執行緒是程式的一部分,是比程式更小的能獨立執行的基本單位,一個程式下的多個執行緒可以共享該程式的所有資源
2、如果IO操作密集,則可以多執行緒執行效率高,缺點是如果一個執行緒崩潰,都會造成程式的崩潰
應用:
IO密集的用多執行緒,在使用者輸入,sleep
時候,可以切換到其他執行緒執行,減少等待的時間
CPU密集的用多程式,因為假如IO操作少,用多執行緒的話,因為執行緒共享一個全域性直譯器鎖,當前執行的執行緒會霸佔GIL,其他執行緒沒有GIL,就不能充分利用多核CPU的優勢
-
-
同程式中的不同執行緒如何通訊?
-
程式間的通訊方式
- 管道( pipe
):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程式間使用。程式的親緣關係通常是指父子程式關係。
- 有名管道 (namedpipe) :
有名管道也是半雙工的通訊方式,但是它允許無親緣關係程式間的通訊。
- 訊號量(semophore ) :
訊號量是一個計數器,可以用來控制多個程式對共享資源的訪問。它常作為一種鎖機制,防止某程式正在訪問共享資源時,其他程式也訪問該資源。因此,主要作為程式間以及同一程式內不同執行緒之間的同步手段。
- 訊息佇列( messagequeue ) :
訊息佇列是由訊息的連結串列,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
- 訊號 (sinal ) :
訊號是一種比較複雜的通訊方式,用於通知接收程式某個事件已經發生。
- 共享記憶體(shared memory )
:共享記憶體就是對映一段能被其他程式所訪問的記憶體,這段共享記憶體由一個程式建立,但多個程式都可以訪問。共享記憶體是最快的
IPC
方式,它是針對其他程式間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號兩,配合使用,來實現程式間的同步和通訊。
- 套接字(socket ) :
套解口也是一種程式間通訊機制,與其他通訊機制不同的是,它可用於不同及其間的程式通訊。
-
執行緒間的通訊方式
-
鎖機制:包括互斥鎖、條件變數、讀寫鎖
*互斥鎖提供了以排他方式防止資料結構被併發修改的方法。
*讀寫鎖允許多個執行緒同時讀共享資料,而對寫操作是互斥的。
*條件變數可以以原子的方式阻塞程式,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變數始終與互斥鎖一起使用。
-
訊號量機制(Semaphore):包括無名執行緒訊號量和命名執行緒訊號量
-
訊號機制(Signal):類似程式間的訊號處理
執行緒間的通訊目的主要是用於執行緒同步,所以執行緒沒有像程式通訊中的用於資料交換的通訊機制。
-
-
-
執行緒共享堆疊嗎?
-
同一個程式中的執行緒是共享資料段的,程式是作業系統分配資源的單位,
而執行緒是作業系統真正排程的單位,建立執行緒時並不會對資料執行緒進行重新分配。
執行緒有自己的threadID、棧和暫存器集合的值,這些線上程上下文切換時,作業系統都會做好相應的儲存後才能切換,棧和暫存器的值以及程式計數器的值表明了當前執行緒的執行過程,對這些進行儲存就能儲存好執行的現場,以便下次返回時繼續執行。
執行緒共享的內容包括:
-
1.程式程式碼段
-
2.程式資料段
-
3.程式開啟的檔案描述符、
-
4.訊號的處理器、
-
5.程式的當前目錄和
-
6.程式使用者ID與程式組ID
-
7.堆
-
執行緒獨有的內容包括:
-
1.執行緒ID
-
2.暫存器組的值
-
3.執行緒的棧
-
4.錯誤返回碼
-
5.執行緒的訊號遮蔽碼
-
-
**手撕程式碼:實現一個裝飾器快取上次函式執行的結果快取10s?(只實現了裝飾器、快取函式執行結果失敗,當時有點緊張沒想出來吧。)
import sys, re, time, hashlib, pickle
cache = {}
def is_obsolete(entry, duration):
d = time.time()-entry['time']
return d > duration
def compute_key(function, args, kwargs):
key = pickle.dumps((function.__name__, args, kwargs))
return hashlib.sha1(key).hexdigest()
def memoize(duration=10):
def _memorize(function):
def __memorize(*args, **kwargs):
key = compute_key(function, args, kwargs)
if key in cache :
print ('have been on cache')
# return cache[key]['value']
else:
result = function(*args, **kwargs)
cache[key] = {'value': result, 'time': time.time()}
print('get in cache')
return result
return __memorize
return _memorize
@memoize(10)
def testadd(a, b):
# time.sleep(2)
return a+b
def dec1(func):
print("1111")
def one():
print("2222")
func()
print("3333")
return one
def dec2(func):
print("aaaa")
def two():
print("bbbb")
print("test test")
print("cccc")
return two
# @dec1
@dec2
def test():
print("test test")
test()
- 手撕程式碼:實現數字反轉包括複數,範圍-2147483648 < x < 2147483647
class Solution(object):
def reverse(self, x):
if -10 < x < 10:
return x
str_x = str(x)
if str_x[0] != "-":
str_x = str_x[::-1]
x = int(str_x)
else:
str_x = str_x[:0:-1]
x = int(str_x)
# x = -x
return x if -2147483648 < x < 2147483647 else 0
def testtest():
x = input("輸入一個陣列、以空格隔開 arr :")
arr = list(map(int, x.split(" ")))
n = input("輸入一個整數 n:")
n = int(n)
res = [arr[i:i + n] for i in range(0, len(arr), n)]
print(res)
# if __name__ == '__main__':
# # s = Solution()
# # reverse_int = s.reverse(-123)
# # print(reverse_int)
杭州銪人/覽眾資料
重複題目不再寫
-
**python垃圾回收https://zhuanlan.zhihu.com/p/54430650
-
軟體工程的單例模式/軟體工程有哪些模式
-
單例模式:單例模式是設計模式中最常用的一種模式。一個類只能建立一個物件,即單例模式,該模式可以保證系統中該類只有一個例項,並提供一個訪問它的全域性訪問點,該例項被所有程式模組共享。比如在某個伺服器程式中,該伺服器的配置資訊存放在一個檔案中,這些配置資料由一個單例物件統一讀取,然後服務程式中的其他物件再透過這個單例物件獲取這些配置資訊,這種方式簡化了在複雜環境下的配置管理。
-
舉個例子,一個專案就相當於一個教室,你需要找到學生必須找班主任,班主任的設計就是這種物件,只能有一個,但是能訪問到所有學生。而且班主任類,不能繼承和重寫,就只有一個
-
軟體工程有:單例模式,工廠模式
-
工廠模式大致可以分為三類: 1、簡單工廠模式 2、工廠方法模式
3、抽象工廠模式。 這三種模式逐步抽象,並且更具有一般性。
工廠模式有一種非常形象的描述,建立物件的類就像一個工廠,而需要被建立的物件就是一個個產品,在工廠中加工產品,使用產品的人不用關心產品是如何生產出來的。在軟體中使用工廠模式的好處就是降低了模組之間的耦合。
一、簡單工廠模式:
簡單工廠模式是工廠模式中最簡單的一種,他可以用比較簡單的方式隱藏建立物件的細節,一般只需要告訴工廠類所需要的產品型別,工廠類就會返回需要的產品物件。
二、工廠方法模式:
由於簡單工廠模式違反了開閉原則,所以工廠方法模式的出現了,工廠方法模式是在簡單工廠模式的基礎上,對”工廠”新增了一個抽象層,將工廠的動作抽象出來,作為抽象類,而具體的行為由工廠類的子類去實現,讓工廠類的子類決定去生產什麼型別的產品。
三、抽象工廠模式:
工廠方法模式和簡單工廠模式都適用於”產品種類結構單一”的場合,為一類產品提供建立的介面。
-
-
django專案從訪問到響應的整個過程https://www.cnblogs.com/shangjunnihao/p/11...
-
手撕程式碼:括號匹配
class SStack(): #定義一個棧用來存放匹配的括號,因為括號匹配相當於一個棧 先進後出的過程
def __init__(self):
self.x = []
def is_empty(self):
return self.x == []
def top(self):
return self.x[-1]
def push(self, elem):
self.x.append(elem)
def pop(self):
return self.x.pop() # 移除列表中的一個元素(預設最後一個元素),並且返回該元素的值。
def check(text):
all = "()[]{}" # 定義所有括號
left = "([{" # 左括號
dict0 = {")": "(", "]": "[", "}": "{"} # 用字典存放匹配規則
def test(text):
i, text_len = 0, len(text)
while True:
while i < text_len and text[i] not in all:
i += 1
if i >= text_len:
return
yield text[i], i # 在輸入的文字中找到括號並yield一個 (括號,位置)的元組
i += 1
st = SStack()
for text0, i in test(text):
if text0 in left: # 首先找到左括號
st.push(text0)
elif st.pop() != dict0[text0]: # 如果是右括號,就棧頂元素進行匹配檢查
print("false")
return False # 遇到不匹配的,就直接退出函式,結束匹配
print("true") # 如果函式還能夠執行到這裡說明所有的括號都是匹配的
return True
x = input("輸入一個檢查的內容:")
check(x)
這裡我只記得了幾個典型得公司,其他公司的內容離不開資料結構,計算機網路。基本上都是這些東西。
深一點的瞭解一下軟體工程的用例方式。
還有許多涉及到的演算法題我會一一上傳,當時我只記下了我寫的解答原始碼,具體題目還需要解析一哈,(我忘記了~~)
前前後後面了大概15-20個公司吧,基本的內容都離不開我在前面頭部發的幾個github連結。這裡只是針對我個人經驗總結了一下。
再其他公司除了許多演算法題,很多都是現在在leetcode上見到過的。
很後悔當初第一二次就面試了位元組頭條,沒準備好,也是瞎投的沒抱希望 畢竟都10月了當時。
這裡就不推薦什麼的了,但是大家如果準備面試刷leetcode的話,跟著熱題,分類題來刷吧!!(ง •_•)ง
本作品採用《CC 協議》,轉載必須註明作者和本文連結