iOS快手面經(已拿offer)送給準備面試大廠的你

来源:https://www.cnblogs.com/IOSkf/archive/2020/06/13/13113750.html
-Advertisement-
Play Games

背景 過完年來北京之後,有準備看看機會,也是想瞭解下市場行情。簡歷沒有投太多,只定向投了頭條教育部門、抖音、快手、阿裡,這些公司。 頭條和阿裡的簡歷都沒過,肯定是亮點太少吧。只有快手簡歷過了,快手是三輪技術面+一輪HR面,前兩輪技術都比較順利,到第三輪卻栽了,很痛心o(╥﹏╥)o。目前就不考慮換工作 ...


背景

過完年來北京之後,有準備看看機會,也是想瞭解下市場行情。簡歷沒有投太多,只定向投了頭條教育部門、抖音、快手、阿裡,這些公司。

頭條和阿裡的簡歷都沒過,肯定是亮點太少吧。只有快手簡歷過了,快手是三輪技術面+一輪HR面,前兩輪技術都比較順利,到第三輪卻栽了,很痛心o(╥﹏╥)o。目前就不考慮換工作了,等下半年再說了,接下來的時間再好好精煉一下。

快手是視頻面試,不支持周末,但是可以選擇晚上時間,我這幾次都是定在了晚上九點。視頻面試是通過牛客網進行的,以下是我還記得下來的各輪面試題,對於一些iOS基礎知識就不做解答了。

一面

1、用遞歸寫一個演算法,計算從1到100的和。

func sum(value: Int) -> Int {
    if value <= 0 {
        return 0
    }
    var number = value
    return value + sum(value: number - 1)
}
// 計算過程
let result = sum(value: 100)
print(result)

作為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個我的iOS交流群:761407670 進群密碼博客,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿裡面試題、面試經驗,討論技術, 大家一起交流學習成長!

 

寫完演算法之後又圍繞著問了幾個問題,都是演算法基礎:

  • 演算法的時間複雜度是多少
  • 遞歸會有什麼缺點
  • 不用遞歸能否實現,複雜度能否降到O(1)

2、property的作用是什麼,有哪些關鍵詞,分別是什麼含義?

3、父類的property是如何查找的?

4、NSArrayNSDictionary應該如何選關鍵詞?

5、copymuteCopy有什麼區別,深複製和淺複製是什麼意思,如何實現深複製?

6、用runtime做過什麼事情?runtime中的方法交換是如何實現的?

7、講一下對KVC合KVO的瞭解,KVC是否會調用setter方法?

8、__block有什麼作用

9、說一下對GCD的瞭解,它有那些方法,分別是做什麼用的?

10、對二叉樹是否瞭解?

面試官是想接著問這方面的問題的。我當時說了不瞭解,然後就沒有後續了。

二面

1、ARC和MRC的區別,iOS是如何管理引用計數的,什麼情況下引用計數加1什麼情況引用計數減一?

2、在MRC下執行[object autorelease]會發生什麼,autorelease是如何實現的?

3、CoreAnimation是如何繪製圖像的,動畫過程中的frame能否獲取到?

4、談一下對Runlop的瞭解?

5、OC如何實現多繼承?

這個當時沒有答好。其實藉助於消息轉發,protocol和類別都可以間接實現多繼承。

6、對設計模式有什麼瞭解,講一下其中一種是如何使用的。

7、有沒有哪個開源庫讓你用的很舒服,講一下讓你舒服的地方。
我這裡說了RxSwift中的觀察者模式,和響應式編程。然後面試官問,如果要用OC實現一套RxSwift那樣的邏輯應該怎麼做。我回答的是結合KVO,將一些需要觀察的屬性,通過KVO進行監聽,然後通過block回調出來。

8、一張100*100,RGBA的png圖像解壓之後占多大記憶體空間。
RGBA > FFFFFFFF > 4位元組
所以會占用:(100 * 100 * 4) / 1024 = 39KB

9、演算法題

題目:給定一個個數字arr,判斷數組arr中是否所有的數字都只出現過一次。

這個並沒有要求寫出來,說是提供思路就行了。我當時給的方案是在便利數組的時候,用一個字典把便利的元素存起來,如果在後面的便利過程中新元素在字典中存在過就說明,有重覆數字出現。時間複雜度是O(n)。

當時也問了有沒有辦法進行優化,我當時想到了將數組轉成Set,然後和原數組比較,兩個集合的數量是否變化。

10、因為我跟他介紹自己Swift用的多一些,然後問了些Swift跟OC的區別,各自的優缺點。

11、為什麼離職,有什麼職業規劃。

三面

1、給定一個Int型數組,用裡面的元素組成一個最大數,因為數字可能非常大,用字元串輸出。


輸入: [3,30,34,5,9]
輸出: 9534330

這個是leetcode的179題,難度中等。面試官讓先說思路,再去做題。事先說一下這個題我沒有做過。當時的思路是用冒泡法進行排序,排序的前提是將較少位數的數字進行迴圈補齊,例如3和30的比較,變成33和30的比較,34和4的比較變成34和44的比較,然後將結果從大到小整合成字元串輸出。

但是做題是卻發現沒那麼簡單,位數的補齊對於2位和3位數的比較還需要求位數的最小公倍數,將他們都轉成6位數才能比較。在掙扎了5分鐘做了就做罷了。

後來再去做這道題,其實這就是一個排序而已,只不過他的規則是按高位優先順序更高的原則,而這一點跟字元串的比較保持一致,如果再加一些Swift的高階函數,就可以寫成:

func largestNumber(_ nums: [Int]) -> String {
    let sort = nums.map {"\($0)"}.sorted { (lStr, rStr) -> Bool in
        return lStr + rStr > rStr + lStr
    }
    let result = sort.joined()
    if result.prefix(1) == "0" {
        return "0"
    } else {
        return result
    }
}

2、項目中有這麼一個方法func findfile(dir: String suffix: String) -> [String] ,可以通過輸入文件夾目錄,和尾碼檢索出所需的文件。

例如需要在某個文件中檢索txt文件或者mp4文件,那就傳入dir和suffix就行了。現在又有一些需求,例如需要檢索utf8格式的txt或者h264編碼的mp4,也會有一些例如查找最近一周更新過的文件這樣的需求,你如何優化這個類,讓它滿足這些情況?

我首先想到的是這麼多需求不可能一個方法就完成,需要根據不同場景拆出不同的方法,但是這些同屬於文件操作,會有一個共同使用的方法就是檢索文件。這個方法需要傳入文件目錄,然後遞歸的返回當前目錄所有文件路徑。外部不同場景的調用邏輯就用一個enum完成,不同值對應相同範圍的不同種類。

面試官比較關註內部共用的文件檢索怎麼寫,他說子文件如果過多怎麼辦,如何優化。我有點懵,查找文件至少是要遍歷一遍的,子文件過多,這個應該是沒法優化的啊。中間卡了一段時間,後來他給了提示說是不是可以用block實現,將文件路徑返回出去,由外部決定當前文件是否可用,最終外部的調用類是這個樣子。


max-width: 100%;">//我的方案
//func findDir(_ dir: String) -> [String]
//block方案
func findDir(_ dir: String, block: ((String) -> Bool))

我想來確實沒毛病,用block返回內容至少不會將該目錄的所有文件都由一個對象持有,而前面一堆的鋪墊其實也都是為驗證block方案的好處。

其實事後想下這個問題沒啥難的,這種寫法自己也有寫過,但當時就是沒想起來,可能前面一圈的鋪墊給我帶偏了吧,說虧也不虧,以後多多努力吧。

總結

整體來看,快手的面試題跟我在別處看到的iOS面試題對比要簡單些,一面主要是基礎知識,二面考察更全面一些,更多讓自己談一些對技術的理解,三面則是更偏實踐一些。

演算法雖然三輪都有,但相對比較簡單,即使寫不出來,有思路也是可以的。當然寫出來肯定是加分項,所以大家準備面試時,應該都看一下。演算法相關的,排序,數組,二叉樹,這幾類是重點。

作為一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個我的iOS交流群:761407670 進群密碼 博客 ,不管你是小白還是大牛歡迎入駐 ,分享BAT,阿裡面試題、面試經驗,討論技術, 大家一起交流學習成長!

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • redis 的集合是無序的,集合成員是唯一的,不能重覆。用戶可以快速地對集合執行添加元素操作、移除元素操作以及檢查一個元素是否存在於集合中。這裡介紹一些常用的集合處理命令,併在 Yii 中的使用。 SADD SADD:SADD key-name item [item …]將一個或多個元素添加到集合里 ...
  • 如何查看SQL執行計劃 使用 PL/SQL 查看,具體使用方法如下: 新建 解釋計劃視窗 ,將 SQL 複製進去執行,即可顯示執行計劃。 選中 SQL 語句,點擊菜單 工具-解釋計劃 或 按快捷鍵 F5 執行計劃結果說明 表掃描 table access by index rowid 通過ROWID ...
  • 現在有如下表 id name age 1 張三 23 2 李四 34 3 張三 23 4 李四 32 需求 : 按照name和age欄位聯合去重 sql如下 select * from user group by name,age 文章轉自:https://blog.csdn.net/qq_2898 ...
  • 1.重置密碼的第一步就是跳過MySQL的密碼認證過程,方法如下: #vim /etc/my.cnf(註:windows下修改的是my.ini) 很多老鐵,在開始時設置了 MySQL 的密碼,後來一段時間沒有用 MySQL之後,密碼忘了~ QAQ,請別急,現在有以下方法解決密碼忘了的情況。 1.首先我 ...
  • 最近一個電子看板小項目上線,由於資料庫非常小,而且數據也不太重要。因此未選擇XtraBackup備份,打算用AutoMySQLBackup來備份,結果部署後測試發現,有一些小問題是之前解決過的。有一些是MySQL 5.7版本才有的。下麵記錄一下解決過程。關於AutoMySQLBackup的基礎知識,... ...
  • 42.統計APP應用的DB連接及IP情況 select b.hostname ,a.client_net_address, b.program_name ,count(1) as Qtyfrom sys.dm_exec_connections a(nolock) inner join sys.sys ...
  • 在開發過程中,埋點可以解決兩大類問題:一是瞭解用戶使用 App 的行為,二是降低分析線上問題的難度。目前,iOS 開發中常見的埋點方式,主要包括: 代碼埋點 可視化埋點 無埋點 代碼埋點 代碼埋點主要就是通過手寫代碼的方式來埋點,能很精確的在需要埋點的代碼處加上埋點的代碼,可以很方便地記錄當前環境的 ...
  • 分享近期 GitHub 上比較流行的 22 個和 iOS 開發相關的開源項目。 包括開發輔助工具,非同步編程庫,JSON 解析,移動端資料庫,圖像視頻處理,網路請求,UI 框架、組件,演算法、數據結構等內容。 Accio 使用 Swift 編寫的 iOS/tvOS/watchOS/macOS 依賴管理工 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...