背景
面的是快手X3崗位,視頻面試事扭,不支持周末捎稚,但是可以選擇晚上時(shí)間。視頻面試是通過徘箝希客網(wǎng)進(jìn)行的今野,以下是記下來的各輪面試題,對(duì)于一些iOS基礎(chǔ)知識(shí)就不做解答了罐农。
一面
1条霜、用遞歸寫一個(gè)算法,計(jì)算從1到100的和涵亏。
func sum(value: Int) -> Int {
if value <= 0 {
return 0
}
var number = value
return value + sum(value: number - 1)
}
// 計(jì)算過程
let result = sum(value: 100)
print(result)
復(fù)制代碼
寫完算法之后又圍繞著問了幾個(gè)問題宰睡,都是算法基礎(chǔ):
- 算法的時(shí)間復(fù)雜度是多少
- 遞歸會(huì)有什么缺點(diǎn)
- 不用遞歸能否實(shí)現(xiàn),復(fù)雜度能否降到O(1)
2气筋、property
的作用是什么拆内,有哪些關(guān)鍵詞,分別是什么含義宠默?
3麸恍、父類的property
是如何查找的?
4搀矫、NSArray
抹沪、NSDictionary
應(yīng)該如何選關(guān)鍵詞?
5艾君、copy
和muteCopy
有什么區(qū)別采够,深復(fù)制和淺復(fù)制是什么意思,如何實(shí)現(xiàn)深復(fù)制冰垄?
6蹬癌、用runtime
做過什么事情权她?runtime
中的方法交換是如何實(shí)現(xiàn)的?
7逝薪、講一下對(duì)KVC合KVO的了解隅要,KVC是否會(huì)調(diào)用setter
方法?
8董济、__block
有什么作用
9步清、說一下對(duì)GCD的了解,它有那些方法虏肾,分別是做什么用的廓啊?
10、對(duì)二叉樹是否了解封豪?
面試官是想接著問這方面的問題的谴轮。我當(dāng)時(shí)說了不了解,然后就沒有后續(xù)了吹埠。
二面
1第步、ARC和MRC的區(qū)別,iOS是如何管理引用計(jì)數(shù)的缘琅,什么情況下引用計(jì)數(shù)加1什么情況引用計(jì)數(shù)減一粘都?
2、在MRC下執(zhí)行[object autorelease]
會(huì)發(fā)生什么刷袍,autorelease
是如何實(shí)現(xiàn)的翩隧?
3、OC如何實(shí)現(xiàn)多繼承做个?
這個(gè)當(dāng)時(shí)沒有答好鸽心。其實(shí)借助于消息轉(zhuǎn)發(fā),protocol
和類別都可以間接實(shí)現(xiàn)多繼承居暖。
4顽频、對(duì)設(shè)計(jì)模式有什么了解,講一下其中一種是如何使用的太闺。
5糯景、有沒有哪個(gè)開源庫(kù)讓你用的很舒服,講一下讓你舒服的地方省骂。
6蟀淮、一張100*100,RGBA的png圖像解壓之后占多大內(nèi)存空間钞澳。
5怠惶、算法題
題目:給定一個(gè)個(gè)數(shù)字arr,判斷數(shù)組arr中是否所有的數(shù)字都只出現(xiàn)過一次轧粟。
這個(gè)并沒有要求寫出來策治,說是提供思路就行了脓魏。我當(dāng)時(shí)給的方案是在便利數(shù)組的時(shí)候,用一個(gè)字典把便利的元素存起來通惫,如果在后面的便利過程中新元素在字典中存在過就說明茂翔,有重復(fù)數(shù)字出現(xiàn)。時(shí)間復(fù)雜度是O(n)履腋。
當(dāng)時(shí)也問了有沒有辦法進(jìn)行優(yōu)化珊燎,我當(dāng)時(shí)想到了將數(shù)組轉(zhuǎn)成Set
,然后和原數(shù)組比較遵湖,兩個(gè)集合的數(shù)量是否變化悔政。
7、因?yàn)槲腋榻B自己Swift用的多一些延旧,然后問了些Swift跟OC的區(qū)別卓箫,各自的優(yōu)缺點(diǎn)。
8垄潮、為什么離職,有什么職業(yè)規(guī)劃闷盔。
三面
1弯洗、給定一個(gè)Int型數(shù)組,用里面的元素組成一個(gè)最大數(shù)逢勾,因?yàn)閿?shù)字可能非常大牡整,用字符串輸出。
輸入: [3,30,34,5,9]
輸出: 9534330
復(fù)制代碼
這個(gè)是leetcode的179題溺拱,難度中等逃贝。面試官讓先說思路,再去做題迫摔。事先說一下這個(gè)題我沒有做過沐扳。當(dāng)時(shí)的思路是用冒泡法進(jìn)行排序,排序的前提是將較少位數(shù)的數(shù)字進(jìn)行循環(huán)補(bǔ)齊句占,例如3和30的比較沪摄,變成33和30的比較,34和4的比較變成34和44的比較纱烘,然后將結(jié)果從大到小整合成字符串輸出杨拐。
但是做題是卻發(fā)現(xiàn)沒那么簡(jiǎn)單,位數(shù)的補(bǔ)齊對(duì)于2位和3位數(shù)的比較還需要求位數(shù)的最小公倍數(shù)擂啥,將他們都轉(zhuǎn)成6位數(shù)才能比較哄陶。在掙扎了5分鐘做了就做罷了。
后來再去做這道題哺壶,其實(shí)這就是一個(gè)排序而已屋吨,只不過他的規(guī)則是按高位優(yōu)先級(jí)更高的原則蜒谤,而這一點(diǎn)跟字符串的比較保持一致,如果再加一些Swift的高階函數(shù)离赫,就可以寫成:
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
}
}
復(fù)制代碼
2芭逝、項(xiàng)目中有這么一個(gè)方法func findfile(dir: String suffix: String) -> [String]
,可以通過輸入文件夾目錄渊胸,和后綴檢索出所需的文件旬盯。
例如需要在某個(gè)文件中檢索txt文件或者mp4文件,那就傳入dir和suffix就行了◆崦停現(xiàn)在又有一些需求胖翰,例如需要檢索utf8格式的txt或者h(yuǎn)264編碼的mp4,也會(huì)有一些例如查找最近一周更新過的文件這樣的需求切厘,你如何優(yōu)化這個(gè)類萨咳,讓它滿足這些情況疫稿?
我首先想到的是這么多需求不可能一個(gè)方法就完成培他,需要根據(jù)不同場(chǎng)景拆出不同的方法,但是這些同屬于文件操作遗座,會(huì)有一個(gè)共同使用的方法就是檢索文件途蒋。這個(gè)方法需要傳入文件目錄号坡,然后遞歸的返回當(dāng)前目錄所有文件路徑。外部不同場(chǎng)景的調(diào)用邏輯就用一個(gè)enum
完成宽堆,不同值對(duì)應(yīng)相同范圍的不同種類腌紧。
面試官比較關(guān)注內(nèi)部共用的文件檢索怎么寫,他說子文件如果過多怎么辦日麸,如何優(yōu)化寄啼。我有點(diǎn)懵,查找文件至少是要遍歷一遍的代箭,子文件過多墩划,這個(gè)應(yīng)該是沒法優(yōu)化的啊。中間卡了一段時(shí)間嗡综,后來他給了提示說是不是可以用block實(shí)現(xiàn)乙帮,將文件路徑返回出去,由外部決定當(dāng)前文件是否可用极景,最終外部的調(diào)用類是這個(gè)樣子察净。
//我的方案
//func findDir(_ dir: String) -> [String]
//block方案
func findDir(_ dir: String, block: ((String) -> Bool))
復(fù)制代碼
我想來確實(shí)沒毛病驾茴,用block返回內(nèi)容至少不會(huì)將該目錄的所有文件都由一個(gè)對(duì)象持有,而前面一堆的鋪墊其實(shí)也都是為驗(yàn)證block方案的好處氢卡。
其實(shí)事后想下這個(gè)問題沒啥難的锈至,這種寫法自己也有寫過,但當(dāng)時(shí)就是沒想起來译秦,可能前面一圈的鋪墊給我?guī)税上考瘢f虧也不虧,以后多多努力吧筑悴。
總結(jié)
整體來看们拙,快手的面試題跟我在別處看到的iOS面試題對(duì)比要簡(jiǎn)單些。一面主要是基礎(chǔ)知識(shí)阁吝,二面考察更全面一些砚婆,更多讓自己談一些對(duì)技術(shù)的理解,三面則是更偏實(shí)踐一些突勇。
算法雖然三輪都有装盯,但相對(duì)比較簡(jiǎn)單,即使寫不出來甲馋,有思路也是可以的验夯。當(dāng)然寫出來肯定是加分項(xiàng),所以大家準(zhǔn)備面試時(shí)摔刁,應(yīng)該都看一下。算法相關(guān)的海蔽,排序共屈,數(shù)組,二叉樹党窜,這幾類是重點(diǎn)拗引。
收錄:原文地址
以下文章可以做一個(gè)學(xué)習(xí)參考:
GCD面試要點(diǎn)
block面試要點(diǎn)
Runtime面試要點(diǎn)
RunLoop面試要點(diǎn)
內(nèi)存管理面試要點(diǎn)
MVC、MVVM面試要點(diǎn)
網(wǎng)絡(luò)性能優(yōu)化面試要點(diǎn)
網(wǎng)絡(luò)編程面試要點(diǎn)
KVC&KVO面試要點(diǎn)
數(shù)據(jù)存儲(chǔ)面試要點(diǎn)
混編技術(shù)面試要點(diǎn)
設(shè)計(jì)模式面試要點(diǎn)
UI面試要點(diǎn)