iOS面試的算法相關(guān)

  • 面試中遇到的這些算法,在平常工作中糠赦,基本不會用到会傲。

  • 不過現(xiàn)實的面試中經(jīng)常喜歡問關(guān)于算法的問題

  • 有些還要求寫出代碼锅棕。一般來說,用c語言表達比較好淌山。因為這是算法啊哲戚,過程式編程,當(dāng)然是c語言比較合適艾岂。

  • XCode中,Object-CC可以混編朋其,這個也算是蠻方便的

  • Object-C推薦的命名方式是“小駝峰”王浴,而C的經(jīng)典應(yīng)用場景是Linux,這里推薦的命名方式是小寫字母加下劃線連接

  • 這里的Demo梅猿,將Object-CC直接混編了氓辣。不過,在實際應(yīng)用中袱蚓,如果避不開C钞啸,那么還是將兩者分開比較好。然后提供一個混編的接口層喇潘,進行隔離体斩。不然,兩種編程風(fēng)格混合颖低,對于代碼的閱讀和維護始終不是好事情絮吵。

Demo地址

快速排序

  • 這是目前所知道的效率最高的排序算法,也是題解起來最抽象的一種排序算法忱屑,需要重點掌握蹬敲。

  • 挖坑填數(shù)+分治法下面這篇文章總結(jié)的很到位
    白話經(jīng)典算法系列之六 快速排序 快速搞定

  • 主要過程是:(s是數(shù)組,l是左邊界莺戒,一般是0伴嗡;r是右邊界,數(shù)組長度-1)
    (1)將數(shù)組最左邊的數(shù)s[l]取出來从铲,暫存在一個臨時變量x中
    (2)i =l; j = r; 將基準數(shù)挖出形成第一個坑s[i]瘪校。==== 挖坑
    (3)j--由后向前找比它小的數(shù),找到后挖出此數(shù)填前一個坑s[i]中
    (4)i++由前向后找比它大的數(shù)食店,找到后也挖出此數(shù)填到前一個坑s[j]中渣淤。
    (5)重復(fù)執(zhí)行2,3二步吉嫩,直到i==j价认,將基準數(shù),暫存在臨時變量x中自娩,填入s[i]中用踩。
    (6)一遍走完了渠退,然后左邊來一下(l = l; r = i - 1); 右邊來一下(l = i + 1; r = r)=== 遞歸法,或者叫分治法
    (7)退出條件是l >= r;(只有一個元素了)

  • 參考代碼:

//快速排序  
void quick_sort(int s[], int l, int r) {
    if (l < r) {
        //Swap(s[l], s[(l + r) / 2]); //將中間的這個數(shù)和第一個數(shù)交換 參見注1
        int i = l, j = r, x = s[l];
        while (i < j) {
            while(i < j && s[j] >= x) {// 從右向左找第一個小于x的數(shù)
                j--;
            }
            if(i < j) {
                s[i] = s[j];
            }
            
            while(i < j && s[i] < x) {// 從左向右找第一個大于等于x的數(shù)
                i++;
            }
            if(i < j) {
                s[j] = s[i];
            }
        }
        s[i] = x;
        quick_sort(s, l, i - 1); // 遞歸調(diào)用
        quick_sort(s, i + 1, r);
    }
}

冒泡排序

  • 這是本人最喜歡的排序算法脐彩,因為簡單

  • 基本思想是找出最小的一個碎乃,放好;然后往前走一步惠奸,在剩下的里面找出最小的一個梅誓,放好;再往前走一步佛南;===一直走到最后一步梗掰;

  • 實現(xiàn)也簡單,i嗅回,j兩層循環(huán)嵌套就可以了及穗。

void bubble_sort(int s[], int length) {
    for (int i = 0; i < length; i++) {
        for (int j = i; j < length; j++) {
            if (s[i] > s[j]) {
                int temp = s[i];
                s[i] = s[j];
                s[j] = temp;
            }
        }
    }
}

網(wǎng)上也有很好的參考文章。
經(jīng)典排序算法 - 冒泡排序Bubble sort

求最大公約數(shù)

采用輾轉(zhuǎn)相除法最簡單绵载。下面這篇文章寫得很清楚
常見算法:C語言求最小公倍數(shù)和最大公約數(shù)三種算法

int gcd(int a, int b) {
    
    int temp = 0;
    
    if (a < b) {
        
        temp = a;
        
        a = b;
        
        b = temp;
        
    }
    
    while (b != 0) {
        
        temp = a % b;
        
        a = b;
        
        b = temp;
        
    }
    
    return a;
}

階乘

這個實現(xiàn)很簡單埂陆,就是遞歸的基本原理。還有著名的裴波那切數(shù)列娃豹,都是這一類問題焚虱。

(1)退出條件:參數(shù)為0或者1的時候,返回1
(2)遞歸:n * f(n-1)

如果要做好一點培愁,就是判斷一下參數(shù)著摔,不要太大,否則程序會傻掉的(數(shù)值越界)

int factorial(int n) {
    if (n > 100) {
        return -1; // 太大了定续,算不出來谍咆,會越界
    }
    if (n == 1 || n ==0 ) {
        return 1;
    }
    return n * factorial(n - 1);
}

二分查找

  • 先要將數(shù)組從小到大排好隊

  • 比較中間那個,找到就返回

  • 根據(jù)比較結(jié)果私股,在左邊找摹察,或者在右邊找

  • 效率比遍歷要高一些

  • 返回的是數(shù)組下標

  • 如果有重復(fù)的,找到一個就返回了倡鲸,不一定是哪一個

int binary_search(int* a, int len, int goal) {
    int low = 0;
    int high = len - 1;
    while (low <= high) {
        int middle = (high - low) / 2 + low; // 直接使用(high + low) / 2 可能導(dǎo)致溢出
        if (a[middle] == goal) {
            return middle;
        }
        //在左半邊
        else if (a[middle] > goal) {
            high = middle - 1;
        }
        //在右半邊
        else {
            low = middle + 1;
        }
    }
    //沒找到
    return -1;
}

判斷質(zhì)數(shù)

這里只用最簡單直接打判斷供嚎,一個個除,看余數(shù)

int isPrime(int n) {
    for(int i = 2; i <= sqrt(n); i++) {
        if(n % i == 0) {
            return 0;
        }
    }
    return 1;
}

更高效的算法峭状,有相關(guān)的文章可以參考
判斷一個數(shù)是否為質(zhì)數(shù)/素數(shù)——從普通判斷算法到高效判斷算法思路

字符串逆序輸出

直接用指針進行操作

void reverse(char s[]) {
    // p指向字符串頭部
    char *p = s ;
    
    // q指向字符串尾部
    char *q = s ;
    while('\0' != *q) {
        q++ ;
    }
    q-- ;
    
    // 交換并移動指針克滴,直到p和q交叉
    while(q > p) {
        char t = *p;
        char m = *q;
        *p = m;
        *q = t;
        p++;
        q--;
    }
}

字符串面試題(一)字符串逆序

參考文章

iOS面試題系列之常見算法

iOS面試中常見的算法題目

史上最全的iOS面試題及答案

iOSInterviewQuestions

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市优床,隨后出現(xiàn)的幾起案子劝赔,更是在濱河造成了極大的恐慌,老刑警劉巖胆敞,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件着帽,死亡現(xiàn)場離奇詭異杂伟,居然都是意外死亡,警方通過查閱死者的電腦和手機仍翰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門赫粥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人予借,你說我怎么就攤上這事越平。” “怎么了灵迫?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵喧笔,是天一觀的道長。 經(jīng)常有香客問我龟再,道長,這世上最難降的妖魔是什么尼变? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任利凑,我火速辦了婚禮,結(jié)果婚禮上嫌术,老公的妹妹穿的比我還像新娘哀澈。我一直安慰自己,他們只是感情好度气,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布割按。 她就那樣靜靜地躺著,像睡著了一般磷籍。 火紅的嫁衣襯著肌膚如雪适荣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天院领,我揣著相機與錄音弛矛,去河邊找鬼。 笑死比然,一個胖子當(dāng)著我的面吹牛丈氓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播强法,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼万俗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饮怯?” 一聲冷哼從身側(cè)響起闰歪,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎硕淑,沒想到半個月后课竣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘉赎,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年于樟,在試婚紗的時候發(fā)現(xiàn)自己被綠了公条。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡迂曲,死狀恐怖靶橱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情路捧,我是刑警寧澤关霸,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站杰扫,受9級特大地震影響队寇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜章姓,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一佳遣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凡伊,春花似錦零渐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至银还,卻和暖如春风宁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛹疯。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工杀糯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苍苞。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓固翰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羹呵。 傳聞我的和親對象是個殘疾皇子骂际,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 總結(jié)一下常見的排序算法。 排序分內(nèi)排序和外排序冈欢。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序歉铝。外排序:指在排序...
    jiangliang閱讀 1,346評論 0 1
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,747評論 0 33
  • 概述 排序有內(nèi)部排序和外部排序凑耻,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序太示,而外部排序是因排序的數(shù)據(jù)很大柠贤,一次不能容納全部...
    蟻前閱讀 5,186評論 0 52
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法类缤,內(nèi)部類的語法臼勉,繼承相關(guān)的語法,異常的語法餐弱,線程的語...
    子非魚_t_閱讀 31,644評論 18 399
  • 前幾天膏蚓,閨蜜的奶奶去世了瓢谢。 那是一個令人心悸的夜晚沒有任何預(yù)兆,沒有任何準備驮瞧,只記得那晚她情緒格外低落氓扛,萎靡不振。...
    陳二楠閱讀 14,185評論 22 61