1.先來了兩個算法題
- 給一個無序的序列匠襟,序列中的數(shù)為整數(shù)(可正可負),求連續(xù)子序列的和的最大值缀棍。
例:-8宅此,1,3爬范,-2父腕,9,-3青瀑,結(jié)果為11(1璧亮,3,-2斥难,9)
//動態(tài)規(guī)劃
int FindGreatestSumOfSubArray(vector<int> array) {
if (array.empty()) return 0;
int sum = array[0], tempsum = array[0]; //注意初始值 不能設為0 防止只有負數(shù)
for (int i = 1; i < array.size(); i++) //從1開始 因為0的情況在初始化時完成了
{
tempsum = (tempsum < 0) ? array[i] : tempsum + array[i];
sum = (tempsum > sum) ? tempsum : sum;
}
return sum;
}
- 給一個鏈表枝嘶,頭指針為front,鏈表長度不確定哑诊,求鏈表倒數(shù)第k個元素的值群扶。
兩個指針,一個指針先走到第k的節(jié)點(走k-1步),然后兩個指針同時移動竞阐,直到前面的指針移動到尾節(jié)點缴饭,后面的指針指向的就是倒數(shù)第K個元素的值
2.iOS開發(fā)問題
1.load和initialize的區(qū)別
load
顧名思義,load方法在這個文件被程序裝載時調(diào)用骆莹。只要是在Compile Sources中出現(xiàn)的文件總是會被裝載颗搂,這與這個類是否被用到無關(guān),因此load方法總是在main函數(shù)之前調(diào)用幕垦。
如果一個類實現(xiàn)了load方法丢氢,在調(diào)用這個方法前會首先調(diào)用父類的load方法。而且這個過程是自動完成的先改,并不需要我們手動實現(xiàn)疚察。
如果一個類沒有實現(xiàn)load方法,那么就不會調(diào)用它父類的load方法盏道,這一點與正常的類繼承和方法調(diào)用不一樣稍浆,需要額外注意一下。
個常見的使用場景是在load方法中實現(xiàn)Method Swizzle
initialize
這個方法在第一次給某個類發(fā)送消息時調(diào)用(比如實例化一個對象)猜嘱,并且只會調(diào)用一次衅枫。initialize方法實際上是一種惰性調(diào)用,也就是說如果一個類一直沒被用到朗伶,那它的initialize方法也不會被調(diào)用弦撩,這一點有利于節(jié)約資源。
與load方法類似的是论皆,在initialize方法內(nèi)部也會調(diào)用父類的方法益楼,而且不需要我們顯示的寫出來。與load方法不同之處在于点晴,即使子類沒有實現(xiàn)initialize方法感凤,也會調(diào)用父類的方法.
initialize方法主要用來對一些不方便在編譯期初始化的對象進行賦值。
①load和initialize方法都會在實例化對象之前調(diào)用粒督,以main函數(shù)為分水嶺陪竿,前者在main函數(shù)之前調(diào)用,后者在之后調(diào)用屠橄。這兩個方法會被自動調(diào)用族跛,不能手動調(diào)用它們。
②load和initialize方法都不用顯示的調(diào)用父類的方法而是自動調(diào)用锐墙,即使子類沒有initialize方法也會調(diào)用父類的方法礁哄,而load方法則不會調(diào)用父類。
③load方法通常用來進行Method Swizzle溪北,initialize方法一般用于初始化全局變量或靜態(tài)變量桐绒。
④load和initialize方法內(nèi)部使用了鎖夺脾,因此它們是線程安全的。實現(xiàn)時要盡可能保持簡單掏膏,避免阻塞線程劳翰,不要再使用鎖
2.GCD和NSOperation的區(qū)別
GCD是基于c的底層api,NSOperation屬于object-c類馒疹。
NSOperation 1.取消任務 2.設置依賴 3.隊列暫停與恢復 4. 任務可以設置優(yōu)先級(NSOperation 的優(yōu)先級)
GCD以 block 為單位,代碼簡潔乙墙。同時 GCD 中的隊列颖变、組、信號量听想、source腥刹、barriers 都是組成并行編程的基本原語。對于一次性的計算汉买,或是僅僅為了加快現(xiàn)有方法的運行速度衔峰,選擇輕量化的 GCD 就更加方便。
而 NSOperation 可以用來規(guī)劃一組任務之間的依賴關(guān)系蛙粘,設置它們的優(yōu)先級垫卤,任務能被取消。隊列可以暫停出牧、恢復穴肘。NSOperation 還可以被子類化。這些都是 GCD 所不具備的舔痕。
3.@autoReleasePool內(nèi)存管理
4.內(nèi)存泄漏場景
1.CF類型內(nèi)存泄漏,CGColorCreate<-->CGColorRelease
2.MRC使用
3.ARC
3.1 NSTimer會造成循環(huán)引用,timer會強引用target即self竟纳,在加入runloop的操作中更哄,又引用了timer,所以在timer被invalidate之前啸如,self也就不會被釋放侍匙。
3.2 使用了block的情況下block內(nèi)部直接調(diào)用self,導致循環(huán)引用
3.3 聲明delegate時請用assign(MRC)或者weak(ARC),retain或者strong會導致內(nèi)存泄漏
5.解決block循環(huán)引用還有什么方法
ARC下:
__weak typeof(self) weakSelf = self;
__unsafe_unretained代替__weak
MRC下
__weak換成__block
6.iOS動態(tài)類型的理解