標籤:
題目:
(參考:陳曦 包子的iOS開發)
我在code review的時候,發現了某個viewController中有這樣一段代碼,覺得很不妥當,請嘗試找出代碼中的任何問題,或者可以最佳化的部分。
-(int)searchMaxNumber:(NSArray *)numbers{ int maxNumber; [numbers enumerateObjectsUsingBlock:^(NSNumber* _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { int intNumber = obj.intValue; if (intNumber > maxNumber) { maxNumber = intNumber; } }]; return maxNumber;}
很多面試者第一反應都是,好像是沒什麼問題啊。如果再仔細的看一下代碼,如果再次回答沒什麼問題,那麼這個人基本可以被淘汰了。
初級問題
1. maxNumber沒有初始值。如果numbers裡面都是負數的話,傳回值為0,結果不對。
解釋:這個問題是必須要回答出來的,讀代碼是最基本的能力。
2. maxNumber變數沒有加 __block修飾。這其實是一段編譯不過的代碼。
解釋:如果這個答不上也不要緊,經過提示讓面試者答出block中不能修改變數值就行了。
進階問題
1. 函數代碼位置有問題
解釋:一個求數組最大值的函數,是很有可能被複用的,這段代碼應該寫在項目的基礎公用類庫中。可以寫成一個公用類的類函數,或者一個數組的category等等,題目裡寫在一個VC中就很容易出現重複造輪子的現象了。
2. 這個函數設計的有問題,傳回值預期並不明確
解釋:很多面試者都會提到,檢查輸入的numbers是不是為空白,如果為空白了怎麼做呢?返回0還是-1?或者是NSIntegerMin?調用的人可能也會有此疑惑,所以我更希望面試者將這個函數改為
-(NSInteger)findMaxNumberIndex:(NSArray)array
或者
-(NSNumber)findMaxNumber:(NSArray*)array
這樣的函數,可以讓調用者更容易預測該函數的運作。
最佳化部分
1. 函數效率還可以最佳化
解釋:關於這一點,其實很多人覺得iOS上即使有這種數組也不會很大的量,找個最大值也不會很慢。但是純粹為了開發速度而且數組長度已知很少的業務情境下,我完全不介意使用[numbers valueForKeyPath:@"@max.intValue"]這樣的方式,而且坑更少,甚至都不用額外寫個函數了。但是如果要寫一個單獨的函數來處理還是用for迴圈吧,畢竟可以節省一個block對象。
2. 參數的處理的最佳化
解釋:萬一一堆int裡面混了兩個float怎麼辦? 這個float又是最大的怎麼辦? 其實只需要使用[NSNumber compare:]方法就好了,管他裡面是什麼類型呢。
3.其他比較散的最佳化點,例如這個數組來源是不是JSON啊,是不是支援字串的數字啊,外部調用如何更好看等等,能答上的當然越多越好。
整理了以上思路,再權衡效能的情況下並未處理數字字串,多線程等情況,修改後的代碼如下,希望可以給大家帶來一些協助。
@interface NSArray (searchMaxNumber)@property (nonatomic ,readonly) NSNumber *maxNumber;@end@implementation NSArray (searchMaxNumber)-(NSNumber *)maxNumber{ NSNumber *maxNumber = nil; Class numberClass = [NSNumber class]; for (NSNumber *num in self) { if (![num isKindOfClass:numberClass]) { continue; } if ([maxNumber compare:num]!= NSOrderedDescending) { maxNumber = num; } } return maxNumber;}@end
文/Jack__yang(簡書作者)
原文連結:http://www.jianshu.com/p/8029b504a4c2
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。
一道簡單的IOS面試題-b