想進BAT?這些面試題助你一臂之力(附答案)

testingbang發表於2019-08-10

1 軟性熱身題

這種題目,考的就是你的軟效能力,比如表達能力,理解能力,協調能力,一個詞概括就是套路。這類題目會在面試開始熱身的時候,問一道兩題,不會多,但是如果你能回答的有條不紊,清晰達意,那麼就會給面試官留下非常好的印象,大致的題目如下:

自我介紹

我叫XXX,畢業於XXX,從事測試行業已經XX年,我擅長介面測試自動化,測試框架,巴拉巴拉,我共服務過X個公司分別有Y個成就,江湖人稱666.總之,儘量用
簡介的語言突出自己的優點,要保持humble,就像我介紹的這樣,嗯:)

介紹下你負責的公司專案

我主導了XXX,協助了YYY,參與了ZZZ。 這個回答你要記清楚,後續的面試肯定還有專案細節,甚至技術實現細節。同類的專案說一個足以,重點突出不同技術棧或者有管理,對外溝通的專案

你有什麼優點和缺點?

實際情況作答,比如優點是長的好看,缺點是太好看之類的,總之,要謙虛,不要傲。

在同一個專案組內,你認為你怎麼做會比另外一名測試更加優秀?

我個人認為這個題目很有迷惑性,如果你只追求比別人優秀,肯定很難跟別人合作,如果你沒有別人優秀,那麼我為什麼要用你?
要我答的話,我重點會放在如何一點一滴積累技術實力,及用這些實力解決專案組存在的問題上,這實際上也是很多優秀測試人員的必備素質

你為什麼離開上家公司?離職原因(這個會在最後問)

看老闆不爽啊,PM太SB啦喜歡的同事跟開發跑啦等等, 一個都不要說!!! 我要面試別人,關注的是離職背後的動機,這人是不是被開除的,這人是不是不好相處,這人是不是有明顯性格缺陷,只要不沾這些必死項,其它實際作答吧。

個人覺得軟性題,不必要過多關注,除自我介紹外,通常是透過面試後HR關的閒聊題,主要還是要關注下面的技術問題。

2 測試理論基礎題

這類題目就是考測試工程師的基本能力了,比如測試計劃,測試流程,如何bug,你做過哪些測試,一般我們認為這些能力做的再好都是應該的,不會有加分,但是隻要做的不好,那就是個不合格的測試工程師了。這種題目也不會問的太多,大概題目如下:

請描述下你上個公司的測試流程?

實際情況作答, Scrum模式舉例如下:
1.我們公司採用Scrum模式開發,測試也跟這個走,在每個sprint開始前會前後召開grooming meeting, planning meeting, Grooming meeting上把這個sprint可能做的tasks從product backlog裡撈出來, 然後按照優先順序排序, planning meeting上估時,做commitments,並確認每個story的後端,前端,測試。
2.planning後sprint正式開始時,需求,design,UI應該都ready了,測試就可以設計用例, 透過review後發給所有組成員review。 story ready for test時,開發把程式碼放到測試環境,測試開始測試,發現問題jira報bug,linked到story,測試全部完成後標記 UAT GL, 等公司release process開始。
3.Release process開始,不同小組把各自程式碼放到統一測試環境,繼續測試一次,這輪關注別組不會影響自己。
4.然後還有一輪甚至兩輪 pre release,主要驗證程式碼,環境,變數等問題。
5.最後release, 觀察下,有問題回退版本,沒問題繼續走下個sprint

請描述下bug的幾個要素?

ID, Summary, reproduce steps, Priority, Assign to, Sprint info, fix version(due data)等等。這道題我好想回答一句,jira裡都有,你自己不會看呀:)

白盒和黑盒的區別,你是怎麼運用的?

簡單來說一個關注內部實現邏輯,一個只從使用者角度出發,不關注具體實現。具體定義及區別請參考我以往文章。
一般中高階測試都會偏灰盒一些,既關注內部實現邏輯又關注使用者jounery,設計case的時候兩邊參考。
內部實現邏輯可以看程式碼,也可以請開發講給你聽,知道了怎麼實現,能在設計用例時構造不同資料cover邏輯覆蓋。同時也清楚了regression 的scope

你是如何做測試分析?

這題是考察測試思維,一個應用/功能如何測試的問題,我的原則是確定需求,先定性後定量。
具體來說,定性, 哪些是顯性需求?那些是隱性需求?功能在scope嗎?效能?可靠性?安全性?相容mobile平臺嗎?
定量就是, 功能要測, 那麼有哪些功能,每個功能點是什麼, 入口是什麼,出口是什麼,precondition是什麼,資料哪裡構造等等。
重複上述操作直到分析完成

如何設計測試用例?什麼樣子的測試用例是好用例?

個人覺得上題回答好了,這題不會問了。 設計用例原則上好的用例各有千秋(不外乎邊界值,等價類,流程圖,正交法,判定表等), 但壞的實踐要避免,具體如下:
1.一個測試用例驗證多個功能點(A,B,C三個功能一個用例,那麼用例失敗了,到底是A引起的?還是B引起的?增加後續開發定位問題的難度,浪費時間)
2.期望結果不明確(例如: make sure every thing works fine. what the f×××?!)
3.不可執行(比如一個配置項組合, 手工要執行的case寫了2000個, 怎麼執行完?)
4.precondition,steps描述不清楚,上手困難(你負責的story可能要由其它測試人員交叉執行)。
5.不必要的外部依賴(用例應直指功能核心,無關的入口/步驟/依賴 不必要一股腦放進來)

功能測試在 beta 版本對外的上線標準是什麼?

貌似業界對beta的定義不太統一,有人說這個是A/B測試的一種, 但一般認為專業測試人員完成後,有部分使用者參與的一輪測試即beta測試。一般測試環境為使用者實際應用環境,目標在於要求使用者使用發現不合理,不符合實際情況的問題,然後改進。
功能上線標準每個公司不一樣,大致如下:
1.所有功能點(需求)都被用例覆蓋到了
2.所有用例執行過至少一遍
3.所有發現的bug被修復並驗證,做過regression了。
4.不能修復的記錄了/關閉了/known issue了。
5.bug曲線區域平穩了

本人認為此類問題屬於淘汰題,一個問題回答不上來或者深度不夠,直接閒聊然後結束面試。


3 測試管理題

這類題目就是考驗你作為測試leader或者測試負責人的管理能力了。

如果專案週期很短,測試人力匱乏,你是怎麼協調的?

範圍不變,趕工/增加人手,快速跟進/並行開始任務。 範圍能變,砍低優先順序用例,縮小測試範圍。

描述下你團隊的測試分工

實話實說, 比如:
幹活是不可能幹活的,這輩子都不可能幹活的, 做管理又不會做,就是顏值這種東西,才能維持得了團隊這樣子。

對於團隊成員,你是如何打kpi的?

沒錢沒顏你速去,童顏巨 你快來這樣子。
我一般看三點:
1.出活
2.持續出活
3.持續精彩的出活

 4   移動測試相關

如今是移動網際網路的天下,誰家沒有個應用,所以這一塊基本都會問到,同時也會看你的簡歷,如果你沒有做過,基本也不會問的太深,如果你是專門做這一塊的,那麼要好好準備了。

概念題 

描述下web測試和移動應用測試的相同點和區別?

把握以下幾點:
0.任何型別測試先定性,再定量, 範圍, 分類一定,大差不差。
1.web通常不要安裝,移動應用通常要安裝。
2.移動裝置存在特殊性,不同裝置的螢幕/解析度,系統,定製UI都不相同。
3.移動應用不應該影響移動裝置現有功能,如電話/簡訊等。
4.移動端要重點關注,發熱(電量消耗), crash, 流量(4G/WIFI/2G)等

你是如何做應用的相容性測試的?

一般相容性主要關注:
1.硬體的適配:不同手機廠商、硬體效能,不同螢幕大小的適配
2.OS版本的相容。 iOS,Android, 手機,pad, 版本號啊,MUI定製啊等
3.不同解析度螢幕的適配
解決辦法(雲測,此處欠我廣告費),除公司自備主流裝置外,需參考:
1.各大廠商釋出的季度/年度手機出貨量,儘量覆蓋出貨量大的,熱門的機型
2.應用做tracking,記錄自己使用者常用機型
3.購買各種雲測服務,解決機型適配問題

請講出客戶端下 3 個常用的效能指標的名稱與具體含義?

基本的:
1.CPU利用率
2.記憶體使用率
3.平均使用者響應時間
獨有的:
1.電量
2.流量
3.首次開啟速度
4.競品相應專案質量比較

iOS應用和Android應用測試有什麼側重點?

主要是iOS系統和Android系統的本質造成的:
1.Android執行基於虛擬機器,iOS則是沙盒機制
2.iOS是偽後臺,任何第三方程式都不能在後臺執行;而Android是真後臺,安卓中任何程式都能在後臺執行,直到記憶體不夠才關閉
3.IOS中用於UI指令許可權最高,安卓中資料處理指令許可權最高。
測試實際應用上來,個人覺得沒有本質區別,要注意以下問題:
1.安全性。 因為Android2的本質,任何程式都就可以輕鬆訪問其他程式檔案,要關注下有沒有偷偷訪問不需要功能/偷流量/常時間執行佔用記憶體消耗電量等問題。
2.Android開源,定製版本過多(比如小米系列MIUI), 要關注定製引起的問題。

請講訴移動應用的灰度是怎麼做的?

灰度釋出作為A/B Test的一種,一般指釋出新功能到部分使用者,收集反饋/改進,進而釋出到全步使用者的一種策略。
個人經歷過以下方面:
1.新服務釋出到全部伺服器,但透過配置項把不同特徵使用者的請求打到不同的後端服務上去。比如ip是中國的使用者訪點選某個按鈕,呼叫的是後端。。。/vi這個API, 而國外ip呼叫。。/V2
2.新功能的後端服務只發布到部分伺服器,只有訪問到這個伺服器的使用者才能用新功能。
3.同一個使用者訪問的平臺不同,請求的服務就不同,比如app的訪問V1, web的訪問V2,可以透過釋出app版本來實現。
另外這個實現還有很多專業的AB測試平臺可以實現, 例如(雲測,此處欠我廣告費)。
如果涉及到寫DB操作, 一般都雙寫。即訪問新服務時,寫到新服務的DB資料也要寫到老服務的DB。甚至全部切換至新服務後再並行執行一段時間,才徹底切換到新服務,停寫老服務。

實踐題 

應用的閃退通常是什麼原因造成的?如果應用閃退,Android 和 iOS 上是分別怎麼抓取日誌的?

一般閃退原因如下:
1.記憶體超載
2.後端服務或動態連結庫未找到
3.應用初始化時無法正確讀取到使用者資料。
4.系統相容問題。
日誌抓取的話,iOS:
1.透過iTunes Connect(Manage Your Applications - View Details - Crash Reports)獲取使用者的crash日誌
2.透過Xcode從你的裝置上獲得崩潰日誌
3.自己在程式中新增崩潰捕捉程式碼,如果應用整合第三方SDK,如百度統計
Android:
1.透過整合第三方SDK,如百度統計、友盟統計等
2、發版時使用加固工具,他們也會收集錯誤日誌,如360加固
3、在程式中新增程式異常崩潰的捕捉程式碼,儲存到本地檔案中

請簡述移動應用在升級安裝時候應該考慮的場景?

實際上跟CS架構的升級沒什麼兩樣:
1.APP有新版本時,開啟APP是否有更新提示。
2.當版本為非強制升級版時,使用者可以取消更新,老版本能正常使用。使用者在下次啟動app時,仍能出現更新提示。
3.當版本為強制升級版時,當給出強制更新後使用者沒有做更新時,退出APP。下次啟動app時,仍出現強制升級提示。
4.不刪除APP直接更新,檢查是否能正常更新,更新後能否正常工作。
5.刪除老的APP,重新下載APP,能不能正常工作。
6.不刪除APP直接更新,檢查更新後的APP和新安裝的APP提供的功能一樣。
7.檢查線上跨版本升級能否成功,版本過老是否提示使用者重灌。
8.更新成功後,使用者資料有沒有丟失,各個配置項是否還原。

給你一個應用,請簡述你會從哪些方面去測試?

一般答分類, 分類如下: 安裝/解除安裝測試, UI, 功能, 效能, 安全, 相容, 易用, 可移植性。切忌東答一下,西答一下。

請描述下微信朋友圈發小影片的用例設計?

先假設一個需求,徵得面試官同意,在這個既定需求下說你的用例,還是那個思想,定性,定量分類, 不展開了,測試用例設計算基本功吧,考察的無非是功能的全面性,邊界/異常條件下的處理, 效能/安全。 主要是有測試思維/結構化思維,設計的用例要系統,不能想起那個說那個。

如果讓你來測試掃碼支付,你會考慮哪些場景?

同上,不贅述

如何測試一個應用的登入場景?

同上,不贅述, 吐槽下,這題改成如何測試百度的登入會更好,BAT齊活了 :) 實際上這3道題有一道就好了。

對中高階測試而言,實踐題也是淘汰題,一項卡殼沒有後續, 但如果在細節上有疏忽,可以網開一面,進入下個環節

5 服務端測試相關

什麼都離不開服務端,所以這是你逃不開的,一般來說服務端會問介面測試,效能測試,更深一點,埋點監控止血也會有。


請問你們公司是如何做介面測試的?

累死我了, 題要做吐了。 介面測試實際跟一般測試不同就是測試用例的設計部分。
1.介面規範拿到。
2.設計介面測試功能用例(主要從使用者角度出發看介面能否實現業務需求,用例設計就是黑盒用例那一套)。
3.各種入參驗證(正常情況,異常情況包括輸入引數個數不對,型別不對,可選/必選, 還有考慮引數有互斥或關聯的情況)。
4.介面返回值各種驗證(符合介面文件需求)
5.瞭解介面實現邏輯,實現邏輯覆蓋(語句/條件/分支/判定/。。。。。)
6.介面能併發執行嗎?
6.採用工具或者自寫程式碼來驗證,HTTP介面一般SoapUI, Jmeter, Fiddler, Postman等都能驗證,自己寫更好。web service介面一般要寫程式碼來呼叫。根據測試用例自動化。
7.發現問題跟功能測試一樣,該報bug報bug,該跟蹤狀態跟蹤狀態

介面測試質量評估標準是什麼?

介面測試說的介面可以是模組介面,也可以是整合介面,那麼質量評估標準也就轉換為單元測試裡的介面測試標準,和整合測試裡的整合測試標準。
實際上這題如果我來回答的話會關注:
1.介面功能是否正確,介面功能是否實現了業務需求。
2.介面引數正確性包括實參形參的個數/屬性,是否匹配。
3.介面併發/序列執行時介面返回值的正確性。
4.有沒有效能問題(併發執行),有無安全問題(使用者能否直接訪問該介面,需不需要驗證)
面試答上面的應該夠了。

請問你們公司是如何做效能測試的?請講訴效能測試的相關指標?

老規矩,先確定需求,再定性,定量。
例如:
1.這次測試目的是什麼,是壓力測試/負載測試/疲勞強度測試/BenchMark測試?
2.測試的硬體環境是什麼?軟體是什麼?
3.測試工具用什麼?
4.有哪些測試指標?
5.測試分析調優/測試報告要嗎?
具體來說:
1.拿到測試需求,確定測試軟硬體環境/測試指標, 使用測試工具(Loadrunner, jmeter)錄製或者編寫測試程式碼,逐步加壓,直到測試目的達成。
2.分析測試結果,編寫測試報告,突出效能指標包括成功,失敗情況,並加以分析。
3.調優(一般都是開發的事)
相關效能指標:
伺服器系統資源方面 CPU佔用率,記憶體佔用率 磁碟的讀寫指標
網路的佔用情況 基礎吞吐率
事務處理速度 如平均登入時間,操作平均響應時間等。

壓力測試和負載測試的區別

一個(壓力測試)把最後一根稻草仍你身上,一個(負載測試)就剩最後一根稻草沒仍,或者仍給你指定數目稻草。

伺服器中一般要監控哪些資料,如何監控的,怎麼從監控資料中發現問題?

CPU, 記憶體, 網路, I/O, 資料庫。等等。 一般用工具監控,另外Windows上有效能監視器。
發現問題,一般要關注閾值,比如CPU利用率超過85%,說明server壓力太大了,資料量一大DB某條SQL寫入速度變慢了等等等等

假設系統A呼叫系統B,我把B的介面都mock了,進行效能測試,這樣有什麼好處和壞處?

好處是去掉的依賴,可以在B沒有好之前測試A,並且B的任何改動/錯誤/失效不會影響我測試A
壞處是真實效能要比測出來的效能差, 效能指標不準確。 因為Mock的服務再真也不能代替真實服務

有一天早上叫車高峰,滴滴服務端掛了大概30分鐘,工程師搶修之後,馬上上線,之後又掛了,請問有哪些原因會造成這個情況?

還是考測試思維, 一定記得先確認需求,再定性,定量。 一般都要反問, 伺服器是哪個伺服器?後端應用伺服器?資料伺服器?快取系統伺服器?中介軟體伺服器?檔案系統伺服器?
然後面試官說個,不說就自己假定一個, 然後第一次掛第二次掛分開說,先問有沒有錯誤碼,日誌有嗎,有就看日誌,沒有就猜 是應用伺服器掛了啊,是不是高峰期頂不住這麼大併發訪問啊?是資料庫伺服器啊,是不是頻繁讀寫受不了啊,讀寫有分開嗎?同步還是非同步啊, 把喇叭裡。
第二次掛,可能更多了,是不是程式碼弄錯了,改壞了,或者把喇叭裡。
總之套路就是效能測試中可能預見的問題及原因,這個你們google下吧,自己分類總結下。

效能這部分題,個人認為除非你面試效能測試工程師,不然都是可選題,答對85%過關肯定沒問題,70%也行。關鍵有個概念,知道效能測試怎麼回事,有問題該往哪個方向想就行了。 

  6 自動化相關

自動化永遠是避不開的,反正你入職的崗位要不要用自動化,你必須得會一點,加分項。這一塊包括,自動化一些理念和自動化的工具使用。

理念和概念
如何看待自動化和手動測試?怎樣的一個比例才是健康的?

見仁見智,一切能提高軟體質量的方法都應該嘗試。
兵無常形,符合自己專案實際情況是最好的。當然你要面試自動化測試,肯定是一切穩定了的功能最好全部自動化掉。 :)

你們公司的自動化投入產出比怎樣?效益怎樣?

實話實說,UI自動化測試發現新bug的效益很低,主要用在迴歸測試上,減少測試工作量。介面測試可就不一樣了,可以小步快跑,也可以集團作戰。

自動化測試用例的覆蓋率多少?

有個50%了不得了吧, 一般核心業務裡的最高優先順序用例100%覆蓋,這些用例也是用來跑冒煙的。 另外的看專案資源了。

完整執行一次自動化用例需要多久時間?

Google說它們分鐘級或者秒級別, 為毛我們都是小時級別 :(

什麼是分層自動化?

金字塔結構, 最底層UnitTest,往上介面API/整合起來的service, 最上面UI自動化

你的測試資料是怎麼準備的?

當然是提前準備的了:)
寫在指令碼里/外部檔案(excel, XML)/資料庫, 逼格逐級提升

測試指令碼的維護成本是怎麼樣的?

兩個原則:
1.不壞就不要修
2.終身追責,誰汙染誰治理

工具使用 

WebDriver 相關

請問你的定位策略是什麼?

啊啊啊,已經兩個小時了,要抓狂了。
ID, Clas, CSS, XPath, jquery指令碼, 總之能不麻煩開發就不麻煩開發。

請問如何實現用例失敗或者異常時候需要截圖?

框架自帶, python+webdriver裡是get_screenshot_as_file, 一般寫一個裝飾器,放在要執行的類上,try, catch下。

請問如何分散式執行webdriver用例?

兩種策略:
1.利用Jenkins等,部署部分程式碼到多個機器上執行
2.RemoteWebDriver

如何在指令碼中執行 JavaScript 程式碼?

driver.execute_scripts(‘指令碼’)

移動應用相關 

Appium 的定位策略有哪些?

使用Appium-Python-Client情況下, 除了以下常規八種定位方式外:
driver.find_element_by_id() –元素的 resrouce-id 屬性
driver.find_element_by_AccessibilityId() – content-desc屬性,替代以前的name。
driver.find_element_by_xpath() –比css定位慢
driver.find_element_by_class_name() –元素的 class 屬性
driver.find_element_by_css_selector()
driver.find_element_by_link_text() –連結元素的全部顯示文字
driver.find_element_by_tag_name() –元素的標籤名
driver.find_element_by_partial_link_text() –連結元素的部分顯示文字

iOS和Android上還有獨特的定位方法:

iOS:
IosUIAutomation –iOS9.3或以下的定位方法
driver.find_element_by_ios_uiautomation(‘.elements()[0]’)
Android:
AndroidUIAutomator, 僅支援 Android 4.2或以上,可支援元素的單個屬性和多個屬性定位。
driver.find_element_by_android_uiautomator(‘new UiSelector().text(“Animation”)’)


請簡述Appium的原理

這個網上一大堆了,百度一下全是,基本就是兩張圖。

iOS 和 Android 的 UI 自動化的原理是什麼?

上面已經答了,如下:
iOS 9.3 and above: Apple’s XCUITest
iOS 9.3 and lower: Apple’s UIAutomation
Android 4.2+: Google’s UiAutomator/UiAutomator2
Android 2.3+: Google’s Instrumentation. (Instrumentation support is provided by bundling a separate project, Selendroid)

當定位策略都失敗的時候,你該怎麼做?

80%是你元素定位的不對,那麼多定位方法,一個不行換另外一個,直接不能定位,先定位父元素,再迴圈找子元素。一般來說XPATH都能定位到,無非是可閱讀性不強。真的全部失效,請求開發幫你改個元素屬性好了。
這題其實還是”測試sense”問題,擴大點變成了怎麼解決工作中困難。反正別認慫, 最好甭廢話,直接開幹。

請問Monkey測試的優缺點?

沒接觸過,此題不會

如果使用monkey發現了一個畢現閃退,請問怎麼使用monkey重現它?

同上


Jmeter

你用jmeter做什麼測試?

介面,效能。

如果有一個登入介面需要服務端返回引數,再帶著這個引數去請求才能完成登入,用jmeter 怎麼做?

可以利用Regular Expression Extractor傳參

———- 最後,來點硬題,嚯嚯嚯! ———-

 
7 硬 題

所謂硬題就是答案一般都是固定或者標準的,答案也不會模稜兩可,包括:演算法,程式設計,sql,linux

演算法:

請寫出氣泡排序

123456789
def maopao(l): def maopao(l):if not isinstance(l, list):raise TypeError("Need a list as parameter")for i in range(len(l)):for j in range(len(l)-1-i):if l[j]>l[j+1]:l[j], l[j+1] = l[j+1], l[j]return l


1~9999數列中數字3出現的次數。用遞推方法解出。



本來以為很簡單,寫了一下,2位數能算出來結果,3位數會報遞迴次數太多, 覺得蹊蹺, 仔細一查,尼瑪這題大有來歷,我跪的心服口服。經過查詢資料,解答如下:

1位數: 0~9

個位數為3: 3, 共1次。

 故0~9之間,3的個數為1


2位數: 10~99

個位數是3: 13, 23, 33 ...93, 共9個。

十位數是3: 30, 31, ....39.   共10個。

故0~99之間,3的個數為1+9+10=20個


3位數: 100~999

個位數是3: 

103, 113, ....193  共10個。

203, 213, ....293  共10個。

903, 913, ....993  共10個。

一共9×10=90次。


十位數是3: 

130, 132  ....139  共10個。

230, 232  ....239  共10個。




930, 931, ....939  共10個。

一共9×10=90次。


百位數是3: 300, 301, ....399  共100個。

故0~999之間,3的個數為20+90+90+100=300次


也可以這樣考慮:

0~999之間:十位個 位共有10個0~99(解釋0~99,100~199,。。。900~999),故有10*20=200次,而百位為1的有100次,共200+100=300次

300=10*20+100


4位數: 0~9999


個位數是3:

1003,1013,1023, 。。。1093 共10個

1103,1113,1123, 。。。1193 共10個

1203..... 共10個

1903....                共10個

共9個10,我們記為A

還有2003~2903, 3003~3903.。。9003~9903 還有9個一樣的A。

所有一共有10個(A), 是10×9×10=900


十位數是3: 

1030,1031,。。。。。。1039, 共10個。

1131~1139,

1231~1239.

。。。

1931~1939, 共有10×10個=100個。我們記為B 

還有千位數是2開頭的,到9開頭的,加起來共有9個(B) 9×10*10=900個。


百位數是3: 

1300, 1301,。。。。1399 共100個。

2300

.。

9300

共10×100=1000個。

千位數是3: 3000,3001,3999 共 1000次。

故0~9999之間,3的個數為300+900*900*900+1000=4000


也可以這樣考慮:

0~9999之間:百位十位 個位共有10個0~999(0~999, 1000~1999, 。。9000~9999),故有10*300=3000次,而千位為1的有1000次,共3000+1000=4000次

4000=10*300+1000


規律:

0~9:1

0~99:20=10*1+10

0~999:300=10*20+100

0~9999:4000=10*300+1000

0~99999:50000=10*4000+10000

0~999999:600000=10*50000+100000


f(1)=1

f(2)=10*f(1)+10 **1

f(3)=10*f(2)+10 **2

f(4)=10*f(3)+10 **3

..

f(n)=10*f(n-1) + 10*(n-1)

程式碼如下:def count_n_times(digit_number): #傳入的是位數if digit_number==1:return 1if digit_number<=0:return 0return 10*count_n_times(digit_number-1) + 10**(digit_number-1)def count_digit_number(number): #給定是一個數return len(str(number))print(count_n_times(count_digit_number(999)))我們再來假設下,如果給你的不是9999而是2345呢?即對於任意給定的數n,怎樣能快速得到0~n之間3的個數呢?(這就是google的原題了(原題是算1),這題太硬了,我啃了幾個小時了,不啃了..)


從一個陣列中找出前4個最大的數,用最優解。


這個就是排序問題了吧,我想法先排好序,在取前4個,那麼多排序,冒泡啊,選擇啊,快排啊。。 這裡面快排最快,用大O演算法O (n * log n )。

思想:

少於2個元素的陣列不需要排序

找一個元素作為基數

小於基數的放一個陣列

大於基數的放一個陣列

針對小於基數的陣列做快速排序,暫且叫low

針對大於基數的陣列做快速排序, 暫且叫high

最終排序後的 low + 【基數】+ high,就是排好序的陣列


def quicksort(l):low = []high = []if len(l)<2:return lelse:base = l[0]for i in range(1,len(l)):if base <l[i]:high.append(l[i])else:low.append(l[i])return quicksort(low) + [base] + quicksort(high)print(quicksort([2,2,1,8,5,7,6])[:4])


其實python裡內建了很多優秀的方法來解決其他語言很繁瑣的問題,比如本題目可以直接:

print(sorted([2,2,1,8,5,7,6])[:4])  


寫一段程式,刪除字串a中包含的字串b,舉例 輸入a = “asdw”,b = “sd” 返回 字串 “aw”,並且測試這個程式。

1234567
def del_ele(a, b):r = ''for i in [x for x in a if x not in b]:r +=ireturn rprint(del_ele("asdw", "sd"))這個就比較簡單了,測試用例就不寫了。

寫一個方法,把字串轉為數字,比如 str=”1234”,變成 int 1234。並且測試這個程式。


def convert_format(a):if not isinstance(a, str):raise TypeError("You need a str")return int(a)print(convert_format("1234"))啃完了google的題,我覺得我肯定沒有領會這兩道題目的意圖, 緊張中。。。。  測試用例就不寫了。


程式設計: 

什麼是物件導向程式設計?

把一切看成物件,三大特性 繼承,封裝,多型

講下Java多執行緒的使用

java多執行緒跟別的語言的多執行緒有區別嗎?
多執行緒一般用來更好的利用CPU資源,解決諸如程式“在一部分上會阻塞”,“在另一部分上需要持續執行”的場合。多執行緒一般用來更好的利用CPU資源,解決諸如程式“在一部分上會阻塞”,“在另一部分上需要持續執行”的場合。
例如有個程式需要接受多個使用者輸入並向伺服器傳送資料,那麼如果不用多執行緒,一旦程式在等待某個使用者輸入時,程式就會阻塞。這段時間其它使用者也不能使用了

有三個執行緒T1,T2,T3,怎麼確保它們按順序執行?

在主執行緒中,每一個執行緒start()後立即join()

Thread 類中的start() 和 run() 方法有什麼區別?

個人理解start()會啟動執行緒,然後呼叫run(),run()方法一般要重寫。
網上資料:
呼叫start()後,執行緒會被放到等待佇列,等待CPU排程,並不一定要馬上開始執行,只是將這個執行緒置於可動行狀態。然後透過JVM,執行緒Thread會呼叫run()方法,執行本執行緒的執行緒體。先呼叫start後呼叫run,這麼麻煩,為了不直接呼叫run?就是為了實現多執行緒的優點,沒這個start不行。

1.start()方法來啟動執行緒,真正實現了多執行緒執行。這時無需等待run方法體程式碼執行完畢,可以直接繼續執行下面的程式碼;透過呼叫Thread類的start()方法來啟動一個執行緒, 這時此執行緒是處於就緒狀態, 並沒有執行。 然後透過此Thread類呼叫方法run()來完成其執行操作的, 這裡方法run()稱為執行緒體,它包含了要執行的這個執行緒的內容, Run方法執行結束, 此執行緒終止。然後CPU再排程其它執行緒

2.run()方法當作普通方法的方式呼叫。程式還是要順序執行,要等待run方法體執行完畢後,才可繼續執行下面的程式碼; 程式中只有主執行緒——這一個執行緒, 其程式執行路徑還是隻有一條, 這樣就沒有達到寫執行緒的目的。
記住:多執行緒就是分時利用CPU,宏觀上讓所有執行緒一起執行 ,也叫併發

請寫一個執行緒安全的單例模型

網上搜下吧,java不太熟

SQL:

說下左連線和右連線


比如有兩張表A和B。 A表B表都有ID列,select* from A left join B where A.ID=B.ID. 會把A表所有記錄顯示,B表裡沒有和A表ID對應的,會顯示NULL。左連線是把符合條件的所有的A表的內容列出來,B表裡如果沒有內容匹配就用NULL代替。 右連線是符合條件的 B表的內容全顯示出來,A表裡沒有匹配就用NULL代替。

介紹下什麼是索引


索引是與表或檢視關聯的磁碟上結構,可以加快從表或檢視中檢索行的速度。索引包含由表或檢視中的一列或多列生成的鍵。這些鍵儲存在一個結構(B樹)中,使 SQL Server 可以快速有效地查詢與鍵值關聯的行。

SQL裡索引的語法:

SQL CREATE INDEX 語法

在表上建立一個簡單的索引。允許使用重複的值:

CREATE INDEX index_name

ON table_name (column_name)

註釋:"column_name" 規定需要索引的列。

SQL CREATE UNIQUE INDEX 語法

在表上建立一個唯一的索引。唯一的索引意味著兩個行不能擁有相同的索引值。

CREATE UNIQUE INDEX index_name

ON table_name (column_name)

CREATE INDEX 例項

本例會建立一個簡單的索引,名為 "PersonIndex",在 Person 表的 LastName 列:

CREATE INDEX PersonIndex

ON Person (LastName)

如果您希望以降序索引某個列中的值,您可以在列名稱之後新增保留字 DESC:

CREATE INDEX PersonIndex

ON Person (LastName DESC)

假如您希望索引不止一個列,您可以在括號中列出這些列的名稱,用逗號隔開:

CREATE INDEX PersonIndex

ON Person (LastName, FirstName)



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942496/viewspace-2653288/,如需轉載,請註明出處,否則將追究法律責任。

相關文章