iOS面試‘騰訊阿里網易’上來就四道算法題璧亚?(一)

前言

現(xiàn)在出去面, 如果是面中高級的, 基本不會問那些特別基礎的東西了, 底層這塊問到的是最多的讨韭,現(xiàn)在大廠有一點,你在一個項目組面完了, 基礎面試這一塊就不用在面了涨岁! 特別在乎的是做過的項目. 如果項目好久很好說話, 項目不好很被動, 不知道怎么去補拐袜。

面試的開始還是算法+底層

由于我面試的都是比較大的公司,所以自然也是做了這方面的準備梢薪,現(xiàn)在面試iOS中高級開發(fā)蹬铺,算法題已是必然會出現(xiàn)的一個環(huán)節(jié)了,這里把面試遇到的算法題和LeetCode上一些比較經典的算法題做一個匯總秉撇,希望對大家有用甜攀。

持續(xù)更新--請iOS的小伙伴關注! 喜歡的話給一個贊吧!

題目

  • 1 實現(xiàn)一個方法琐馆,計算100的階乘规阀。
  • 2 編程實現(xiàn)字符串拷貝,要考慮下內存重疊問題瘦麸。
  • 3 對輸入的字符串谁撼,去除其中的字符‘b’以及連續(xù)出現(xiàn)的‘a’和‘c
  • 4 如何求兩個View的最近公共父類

1 實現(xiàn)一個方法,計算100的階乘滋饲。

主要考慮到通用性厉碟,還有就是盡量不要使用遞歸喊巍,會導致方法棧空間占用過大箍鼓。所以采用for循環(huán)的方式進行計算就OK崭参。

#import <Foundation/Foundation.h>

long long dofactorial(int min, int max){
    if(min > max){
        return 0;
    }
    if(min == 0){
        if(max == 0){
            //0的階乘是1
            return 1;
        }else{
            min = 1;
        }
        
    }
    long long result = 1;
    for (int i = min; i <= max; i++) {
        result *= i;
     
        if(result > INT_MAX){
            //考慮溢出
            return -1;
        }
    }
    return result;
}

int main(int argc, const char * argv[]) {
    
    int result = dofactorial(0, 100);
    printf("result = %lld", result);

    return 0;
}

2 編程實現(xiàn)字符串拷貝,要考慮下內存重疊問題款咖。

解決思路:既然要考慮內存重疊的問題何暮,就是說可能目標地址的起始位置是在源字符串的后半段,或者目標的結束位置在源字符串的前半段铐殃。第一種情況海洼,從末尾開始復制可以解決問題,同理:第二種情況背稼,從首位開始復制可以解決問題贰军,代碼如下:

char *memcpy_qi(char *dst, const char* src, int cl)
{
    assert(dst != NULL && src != NULL);
    char *ret = dst;
    if (dst >= src && dst <= src+ cl-1) //內存重疊玻蝌,從高地址開始復制
    {
        //挪開空間
        dst = dst+ cl-1;
        //將指針挪到結尾
        src = src+ cl-1;
        while (cl—)
            *dst— = *src—;
    }
    else    //正常情況蟹肘,從低地址開始復制
    {
        while (cl—)
            *dst++ = *src++;
    }
    
    return ret;
}
char * strcpy_qi(char *dst,const char *src)
{
    assert(dst != NULL && src != NULL);
    char *ret = dst;
    memcpy_qi(dst, src, strlen(src)+1);
    return ret;
}

3. 對輸入的字符串,去除其中的字符‘b’以及連續(xù)出現(xiàn)的‘a’和‘c’

樣例:
‘aacbd’ -> 'ad'
'aabcd' -> 'ad'
'aaabbccc' -> ''
不允許使用類似string.replace函數
要求時間俯树、空間復雜度盡量優(yōu)化

4 如何求兩個View的最近公共父類

解決思路:
首先帘腹,這個問題必然不能按照常規(guī)的方式去對一個VIew的所有父類去進行for循環(huán)比較,那這個題出的就沒有意義许饿。
再阳欲,每個類的所有父類組成了一個繼承鏈,而在UIKit下陋率,所有的UIView的最終父類也必然是NSObject球化,其實就相當于這兩個類的繼承鏈從NSObject開始向下一直是重合的,直到最后的一個公共父類才開始分開瓦糟,這個最后的公共父類也是最近的公共父類筒愚,這是典型的倒Y字型鏈表組合。那么解題思路就很好做了菩浙,具體代碼如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    Class commonClass = [self commonClass1:[ViewA class] andClass:[ViewB class]];
    NSLog(@"最近公共父類為:%@",commonClass);
}
// 獲取所有父類
- (NSArray *)superClasses:(Class)class {
    if (class == nil) {
        return @[];
    }
    NSMutableArray *result = [NSMutableArray array];
    while (class != nil) {
        [result addObject:class];
        class = [class superclass];
    }
    return [result copy];
}
//對兩條鏈表進行比對
- (Class)commonClass1:(Class)classA andClass:(Class)classB {
    NSArray *arr1 = [self superClasses:classA];
    NSArray *arr2 = [self superClasses:classB];
    NSInteger count = arr1.count < arr2.count ? arr1.count : arr2.count;
    Class resultClass;
    for (NSUInteger i = 0; i < arr1.count; ++i) {
        Class classA = arr1[arr1.count - i - 1];
        Class classB = arr2[arr2.count - i - 1];
        if(classA == classB){
            resultClass = classA;
        }else{
            break;
        }
    }
    return resultClass;
}

4.如何用兩個骰子表示一個月的完整日期

分享個以前朋友給我出的問題巢掺,問題是這樣的:現(xiàn)有兩個骰子,每個骰子6個面劲蜻,全是空的陆淀,現(xiàn)在需要用這兩個骰子表示年月日中的日的全部情況(1-31),1號算01,一個骰子只能表示一位先嬉,且不能兩位都用同一個骰子轧苫,那么在這種情況下,每個骰子的六個面上該怎么刻數字呢疫蔓?
解決思路:
一含懊、月份的日期钾军,是從1號到31號的,那十位上的所有可能性就是0绢要、1吏恭、2、3.個位上也是包含這幾個數的重罪,那么0樱哼、1、2剿配、3必然兩個骰子上都有搅幅。
二、但是呼胚,十位為3的情況只有30茄唐,31,在兩個骰子上都有0蝇更、1沪编、2的情況下,3只在一個骰子有也可以表示出來的年扩,顛倒位置即可蚁廓,那么就是0、1厨幻、2必須每個骰子上都有相嵌。
三、兩頭骰子此時還剩下6個面况脆,日期必須的數字此時還剩下饭宾,3、4格了、5看铆、6、7笆搓、8性湿、9一共7個數,數字比面數多一個满败,那就是還得想辦法再節(jié)省一個肤频。這個時候就要考慮下6和9能不用共用一個面了。
答案:
骰子A : 0算墨、1宵荒、2、3、4报咳、5
骰子B : 0侠讯、1、2暑刃、6厢漩、7、8

文章題目已經整理為完整的答案文檔岩臣!需要的話可以添加QQiOS交流群:761407670 進群密碼000,不管你是小白還是大牛歡迎入駐 溜嗜,分享BAT,阿里面試題、面試經驗架谎,討論技術炸宵, 大家一起交流學習成長!

另附上一份各收集的大廠面試題谷扣,進群可自行下載土全!

底層面試題

記不太清了23333.....底層是問最多的就是runtime,項目這塊問題需要充足準備!;嵯选裹匙!

1.runtime相關問題

一個objc對象的isa的指針指向什么?有什么作用在塔?

說一下對 isa 指針的理解幻件, 對象的isa 指針指向哪里?isa 指針有哪兩種類型蛔溃?

使用runtime Associate方法關聯(lián)的對象,需要在主對象dealloc的時候釋放么篱蝇?

2.Block

Block如何變量截獲贺待?
Block的幾種形式?

3.性能優(yōu)化

如何高性能的畫一個圓角零截?
什么是 離屏渲染麸塞?什么情況下會觸發(fā)?該如何應對涧衙?
如何提升 tableview 的流暢度哪工?

4.Runloop

為什么 NSTimer 有時候不好使?

AFNetworking 中如何運用 Runloop?

PerformSelector:afterDelay:這個方法在子線程中是否起作用弧哎?為什么雁比?怎么解決?

5.什么是函數式編程撤嫩?

函數可以接受函數當作輸入(參數)和輸出(返回值)偎捎。

6.什么是ABI?

應用程序二進制接口(application binary interface,ABI) 描述了應用程序和操作系統(tǒng)之間茴她,一個應用和它的庫之間寻拂,或者應用的組成部分之間的低接口 。ABI不同于API 丈牢,API定義了源代碼和庫之間的接口祭钉,因此同樣的代碼可以在支持這個API的任何系統(tǒng)中編譯

7.什么是MVC,請結合CocoaTouch說明?

8.什么是MVVM己沛,請設計View moled需要考慮哪些朴皆?

    1. 低耦合。視圖(View)可以獨立于Model變化和修改泛粹,一個ViewModel可以綁定到不同的"View"上遂铡,當View變化的時候Model不可以不變,當Model變化的時候View也可以不變晶姊。
    1. 可重用性扒接。你可以把一些視圖邏輯放在一個ViewModel里面,讓很多view重用這段視圖邏輯们衙。
    1. 獨立開發(fā)钾怔。開發(fā)人員可以專注于業(yè)務邏輯和數據的開發(fā)(ViewModel),設計人員可以專注于頁面設計蒙挑,使用Expression Blend可以很容易設計界面并生成xaml代碼宗侦。
    1. 可測試。界面素來是比較難于測試的忆蚀,而現(xiàn)在測試可以針對ViewModel來寫矾利。

9.swift相對于OC有哪些優(yōu)點?

簡潔的語法:
我們不得不承認的是swift語言比OC精簡馋袜,整個項目中丟掉了頭文件男旗,以及頭文件的引入。

報錯精準:
報錯的時候直接顯示報錯行欣鳖。

定義變量簡單:
定義變量不用區(qū)分整型察皇,浮點型等等,變量使用var泽台,常量使用let什荣。

可視化互動效果:
開發(fā)工具帶來了Xcode Playgrounds功能,該功能提供強大的互動效果怀酷,能讓Swift源代碼在撰寫過程中實時顯示出其運行結果稻爬。

函數式編程的支持:
Swift 語言本身提供了對函數式編程的支持;

Objc 本身是不支持的胰坟,通過引入 ReactiveCocoa 這個庫才可支持函數式編程因篇。

持續(xù)更新--請iOS的小伙伴關注! 喜歡的話給一個贊吧泞辐!

該偏文章所有題目已經整理為完整的答案文檔!需要的話可以添加QQiOS交流群:761407670 進群密碼000,不管你是小白還是大牛歡迎入駐 竞滓,分享BAT,阿里面試題咐吼、面試經驗,討論技術商佑, 大家一起交流學習成長锯茄!

推薦閱讀

1.直擊2020——iOS 面試題大全(補充完整版)

2.“新”攜程,阿里茶没,騰訊iOS面試常見問題合集(附答案)

3.我是如何同時拿到阿里和騰訊offer的

4.騰訊&阿里&美團&快手&字節(jié)等10公司面經

5.騰訊社招iOS面試記錄

6.最新阿里騰訊頭條美團等iOS面試總結

7.讓 BAT 的 Offer 不再難拿

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末肌幽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抓半,更是在濱河造成了極大的恐慌喂急,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笛求,死亡現(xiàn)場離奇詭異廊移,居然都是意外死亡,警方通過查閱死者的電腦和手機探入,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門享甸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悠反,“玉大人,你說我怎么就攤上這事绽左∈眨” “怎么了懊纳?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵漠趁,是天一觀的道長慕淡。 經常有香客問我,道長隆嗅,這世上最難降的妖魔是什么界阁? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮胖喳,結果婚禮上,老公的妹妹穿的比我還像新娘贮竟。我一直安慰自己丽焊,他們只是感情好,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布咕别。 她就那樣靜靜地躺著技健,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惰拱。 梳的紋絲不亂的頭發(fā)上雌贱,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音,去河邊找鬼欣孤。 笑死馋没,一個胖子當著我的面吹牛,可吹牛的內容都是我干的降传。 我是一名探鬼主播篷朵,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼婆排!你這毒婦竟也來了声旺?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤段只,失蹤者是張志新(化名)和其女友劉穎腮猖,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體赞枕,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡澈缺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹦赎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谍椅。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖古话,靈堂內的尸體忽然破棺而出雏吭,到底是詐尸還是另有隱情,我是刑警寧澤陪踩,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布杖们,位于F島的核電站,受9級特大地震影響肩狂,放射性物質發(fā)生泄漏摘完。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一傻谁、第九天 我趴在偏房一處隱蔽的房頂上張望孝治。 院中可真熱鬧,春花似錦审磁、人聲如沸谈飒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杭措。三九已至,卻和暖如春钾恢,著一層夾襖步出監(jiān)牢的瞬間手素,已是汗流浹背鸳址。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泉懦,地道東北人稿黍。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像祠斧,于是被迫代替她去往敵國和親闻察。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348