iOS數(shù)據(jù)結(jié)構(gòu)與算法面試題合集

1慢味、不用中間變量,用兩種方法交換A和B的值

// 1.中間變量
void swap(int a, int b) {
   int temp = a;
   a = b;
   b = temp;
}

// 2.加法
void swap(int a, int b) {
   a = a + b;
   b = a - b;
   a = a - b;
}

// 3.異或(相同為0蜘欲,不同為1. 可以理解為不進(jìn)位加法)
void swap(int a, int b) {
   a = a ^ b;
   b = a ^ b;
   a = a ^ b;
}

2章姓、求最大公約數(shù)

/** 1.直接遍歷法 */
int maxCommonDivisor(int a, int b) {
    int max = 0;
    for (int i = 1; i <=b; i++) {
        if (a % i == 0 && b % i == 0) {
            max = i;
        }
    }
    return max;
}
/** 2.輾轉(zhuǎn)相除法 */
int maxCommonDivisor(int a, int b) {
    int r;
    while(a % b > 0) {
        r = a % b;
        a = b;
        b = r;
    }
    return b;
}

// 擴(kuò)展:最小公倍數(shù) = (a * b)/最大公約數(shù)

3啥刻、模擬棧操作

  • 棧是一種數(shù)據(jù)結(jié)構(gòu)秃殉,特點(diǎn):先進(jìn)后出
  • 練習(xí):使用全局變量模擬棧的操作

#include <stdio.h>
#include <stdbool.h>
#include <assert.h>

//保護(hù)全局變量:在全局變量前加static后坝初,這個(gè)全局變量就只能在本文件中使用
static int data[1024];//棧最多能保存1024個(gè)數(shù)據(jù)
static int count = 0;//目前已經(jīng)放了多少個(gè)數(shù)(相當(dāng)于棧頂位置)

//數(shù)據(jù)入棧 push
void push(int x){
    assert(!full());//防止數(shù)組越界
    data[count++] = x;
}
//數(shù)據(jù)出棧 pop
int pop(){
    assert(!empty());
    return data[--count];
}
//查看棧頂元素 top
int top(){
    assert(!empty());
    return data[count-1];
}

//查詢棧滿 full
bool full() {
    if(count >= 1024) {
        return 1;
    }
     return 0; 
}

//查詢棧空 empty
bool empty() {
    if(count <= 0) {
        return 1;
    }
    return 0;
}

int main(){
    //入棧
    for (int i = 1; i <= 10; i++) {
        push(i);
    }
  
    //出棧
    while(!empty()){
        printf("%d ", top()); //棧頂元素
        pop(); //出棧
    }
    printf("\n");
    
    return 0;
}

4钾军、排序算法

選擇排序鳄袍、冒泡排序、插入排序三種排序算法可以總結(jié)為如下:

都將數(shù)組分為已排序部分和未排序部分吏恭。

1.選擇排序?qū)⒁雅判虿糠侄x在左端拗小,然后選擇未排序部分的最小元素和未排序部分的第一個(gè)元素交換。
2.冒泡排序?qū)⒁雅判虿糠侄x在右端樱哼,在遍歷未排序部分的過程執(zhí)行交換哀九,將最大元素交換到最右端剿配。
3.插入排序?qū)⒁雅判虿糠侄x在左端,將未排序部分元的第一個(gè)元素插入到已排序部分合適的位置阅束。

4.1惨篱、選擇排序

  • 【選擇排序】:最值出現(xiàn)在起始端
  • 第1趟:在n個(gè)數(shù)中找到最小(大)數(shù)與第一個(gè)數(shù)交換位置
  • 第2趟:在剩下n-1個(gè)數(shù)中找到最小(大)數(shù)與第二個(gè)數(shù)交換位置
  • 重復(fù)這樣的操作...依次與第三個(gè)、第四個(gè)...數(shù)交換位置
  • 第n-1趟围俘,最終可實(shí)現(xiàn)數(shù)據(jù)的升序(降序)排列砸讳。
void selectSort(int *arr, int length) {
    for (int i = 0; i < length - 1; i++) { //趟數(shù)
        for (int j = i + 1; j < length; j++) { //比較次數(shù)
            if (arr[i] > arr[j]) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

4.2、冒泡排序

  • 【冒泡排序】:相鄰元素兩兩比較界牡,比較完一趟簿寂,最值出現(xiàn)在末尾
  • 第1趟:依次比較相鄰的兩個(gè)數(shù),不斷交換(小數(shù)放前宿亡,大數(shù)放后)逐個(gè)推進(jìn)常遂,最值最后出現(xiàn)在第n個(gè)元素位置
  • 第2趟:依次比較相鄰的兩個(gè)數(shù),不斷交換(小數(shù)放前挽荠,大數(shù)放后)逐個(gè)推進(jìn)克胳,最值最后出現(xiàn)在第n-1個(gè)元素位置
  • …… ……
  • 第n-1趟:依次比較相鄰的兩個(gè)數(shù),不斷交換(小數(shù)放前圈匆,大數(shù)放后)逐個(gè)推進(jìn)漠另,最值最后出現(xiàn)在第2個(gè)元素位置
void bublleSort(int *arr, int length) {
    for(int i = 0; i < length - 1; i++) { //趟數(shù)
        for(int j = 0; j < length - i - 1; j++) { //比較次數(shù)
            if(arr[j] > arr[j+1]) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        } 
    }
}

5、折半查找(二分查找)

折半查找:優(yōu)化查找時(shí)間(不用遍歷全部數(shù)據(jù))
折半查找的原理:

  • 1> 數(shù)組必須是有序的
  • 2> 必須已知min和max(知道范圍)
  • 3> 動(dòng)態(tài)計(jì)算mid的值跃赚,取出mid對應(yīng)的值進(jìn)行比較
  • 4> 如果mid對應(yīng)的值大于要查找的值笆搓,那么max要變小為mid-1
  • 5> 如果mid對應(yīng)的值小于要查找的值,那么min要變大為mid+1

// 已知一個(gè)有序數(shù)組, 和一個(gè)key, 要求從數(shù)組中找到key對應(yīng)的索引位置

int findKey(int *arr, int length, int key) {
    int min = 0, max = length - 1, mid;
    while (min <= max) {
        mid = (min + max) / 2; //計(jì)算中間值
        if (key > arr[mid]) {
            min = mid + 1;
        } else if (key < arr[mid]) {
            max = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;
}

6纬傲、集合結(jié)構(gòu) 線性結(jié)構(gòu) 樹形結(jié)構(gòu) 圖形結(jié)構(gòu)

  • 1.1满败、集合結(jié)構(gòu) 說白了就是一個(gè)集合,就是一個(gè)圓圈中有很多個(gè)元素叹括,元素與元素之間沒有任何關(guān)系 這個(gè)很簡單
  • 1.2算墨、線性結(jié)構(gòu) 說白了就是一個(gè)條線上站著很多個(gè)人。 這條線不一定是直的汁雷。也可以是彎的净嘀。也可以是值的 相當(dāng)于一條線被分成了好幾段的樣子 (發(fā)揮你的想象力)。 線性結(jié)構(gòu)是一對一的關(guān)系
  • 1.3摔竿、樹形結(jié)構(gòu) 說白了 做開發(fā)的肯定或多或少的知道xml 解析 樹形結(jié)構(gòu)跟他非常類似面粮。也可以想象成一個(gè)金字塔。樹形結(jié)構(gòu)是一對多的關(guān)系
  • 1.4继低、圖形結(jié)構(gòu) 這個(gè)就比較復(fù)雜了熬苍。他呢 無窮。無邊 無向(沒有方向)圖形機(jī)構(gòu) 你可以理解為多對多 類似于我們?nèi)说慕患P(guān)系

7、數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)

數(shù)據(jù)結(jié)構(gòu)的存儲(chǔ)一般常用的有兩種 順序存儲(chǔ)結(jié)構(gòu) 和 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)

  • 2.1 順序存儲(chǔ)結(jié)構(gòu)

發(fā)揮想象力啊柴底。 舉個(gè)列子婿脸。數(shù)組。1-2-3-4-5-6-7-8-9-10柄驻。這個(gè)就是一個(gè)順序存儲(chǔ)結(jié)構(gòu) 狐树,存儲(chǔ)是按順序的 舉例說明啊。 棧鸿脓。做開發(fā)的都熟悉抑钟。棧是先進(jìn)后出 ,后進(jìn)先出的形式 對不對 野哭?在塔!他的你可以這樣理解

hello world 在棧里面從棧底到棧頂?shù)倪壿嬕来螢?h-e-l-l-o-w-o-r-l-d 這就是順序存儲(chǔ) 再比如 隊(duì)列 ,隊(duì)列是先進(jìn)先出的對吧拨黔,從頭到尾 h-e-l-l-o-w-o-r-l-d 就是這樣排對的

  • 2.2 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)

再次發(fā)揮想象力 這個(gè)稍微復(fù)雜一點(diǎn) 這個(gè)圖片我一直弄好 蛔溃,回頭找美工問問,再貼上 例如 還是一個(gè)數(shù)組

1-2-3-4-5-6-7-8-9-10 鏈?zhǔn)酱鎯?chǔ)就不一樣了 1(地址)-2(地址)-7(地址)-4(地址)-5(地址)-9(地址)-8(地址)-3(地址)-6(地址)-10(地址)篱蝇。每個(gè)數(shù)字后面跟著一個(gè)地址 而且存儲(chǔ)形式不再是順序 贺待,也就說順序亂了,1(地址) 1后面跟著的這個(gè)地址指向的是2零截,2后面的地址指向的是3麸塞,3后面的地址指向是誰你應(yīng)該清楚了吧。他執(zhí)行的時(shí)候是 1(地址)-2(地址)-3(地址)-4(地址)-5(地址)-6(地址)-7(地址)-8(地址)-9(地址)-10(地址)瞻润,但是存儲(chǔ)的時(shí)候就是完全隨機(jī)的喘垂。明白了?绍撞!

8、單向鏈表\雙向鏈表\循環(huán)鏈表

還是舉例子得院。理解最重要傻铣。不要去死記硬背 哪些什么。定義啊祥绞。邏輯啊非洲。理解才是最重要滴

  • 3.1 單向鏈表

A->B->C->D->E->F->G->H. 這就是單向鏈表 H 是頭 A 是尾 像一個(gè)只有一個(gè)頭的火車一樣 只能一個(gè)頭拉著跑


  • 3.2 雙向鏈表

數(shù)組和鏈表區(qū)別:
數(shù)組:數(shù)組元素在內(nèi)存上連續(xù)存放,可以通過下標(biāo)查找元素蜕径;插入两踏、刪除需要移動(dòng)大量元素,比較適用于元素很少變化的情況
鏈表:鏈表中的元素在內(nèi)存中不是順序存儲(chǔ)的兜喻,查找慢梦染,插入、刪除只需要對元素指針重新賦值,效率高

  • 3.3 循環(huán)鏈表

循環(huán)鏈表是與單向鏈表一樣帕识,是一種鏈?zhǔn)降拇鎯?chǔ)結(jié)構(gòu)泛粹,所不同的是,循環(huán)鏈表的最后一個(gè)結(jié)點(diǎn)的指針是指向該循環(huán)鏈表的第一個(gè)結(jié)點(diǎn)或者表頭結(jié)點(diǎn)肮疗,從而構(gòu)成一個(gè)環(huán)形的鏈晶姊。發(fā)揮想象力 A->B->C->D->E->F->G->H->A. 繞成一個(gè)圈。就像蛇吃自己的這就是循環(huán) 不需要去死記硬背哪些理論知識(shí)伪货。

9们衙、二叉樹/平衡二叉樹

  • 4.1 什么是二叉樹

樹形結(jié)構(gòu)下,兩個(gè)節(jié)點(diǎn)以內(nèi) 都稱之為二叉樹 不存在大于2 的節(jié)點(diǎn) 分為左子樹 右子樹 有順序 不能顛倒 ,懵逼了吧碱呼,你肯定會(huì)想這是什么玩意砍艾,什么左子樹右子樹 ,都什么跟什么鬼巍举? 現(xiàn)在我以普通話再講一遍脆荷,你把二叉樹看成一個(gè)人 ,人的頭呢就是樹的根 懊悯,左子樹就是左手蜓谋,右子樹就是右手,左右手可以都沒有(殘疾嘛炭分,聲明一下桃焕,絕非歧視殘疾朋友,勿怪捧毛,勿怪就是舉個(gè)例子观堂,i am very sorry) , 左右手呢可以有一個(gè),就是不能顛倒呀忧。這樣講應(yīng)該明白了吧

二叉樹有五種表現(xiàn)形式

1.空的樹(沒有節(jié)點(diǎn))可以理解為什么都沒 像空氣一樣
2.只有根節(jié)點(diǎn)师痕。 (理解一個(gè)人只有一個(gè)頭 其他的什么都沒,說的有點(diǎn)恐怖)
3.只有左子樹 (一個(gè)頭 一個(gè)左手 感覺越來越寫不下去了)
4.只有右子樹
5.左右子樹都有

二叉樹可以轉(zhuǎn)換成森林 樹也可以轉(zhuǎn)換成二叉樹而账。這里就不介紹了 你做項(xiàng)目絕對用不到
數(shù)據(jù)結(jié)構(gòu)大致介紹這么多吧胰坟。理解為主, 別死記,死記沒什么用

想要了解和閱讀更多的iOS面試題泞辐,可以添加QQ群:763164022 笔横!群內(nèi)有已經(jīng)整理好的面試題以及答案文檔,同時(shí)咐吼,也希望大家一起多多交流技術(shù)吹缔,行情等等!歡迎你的加入~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锯茄,一起剝皮案震驚了整個(gè)濱河市厢塘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖俗冻,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件礁叔,死亡現(xiàn)場離奇詭異,居然都是意外死亡迄薄,警方通過查閱死者的電腦和手機(jī)琅关,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讥蔽,“玉大人涣易,你說我怎么就攤上這事∫鄙。” “怎么了新症?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長响禽。 經(jīng)常有香客問我徒爹,道長,這世上最難降的妖魔是什么芋类? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任隆嗅,我火速辦了婚禮,結(jié)果婚禮上侯繁,老公的妹妹穿的比我還像新娘胖喳。我一直安慰自己,他們只是感情好贮竟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布丽焊。 她就那樣靜靜地躺著,像睡著了一般咕别。 火紅的嫁衣襯著肌膚如雪技健。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天顷级,我揣著相機(jī)與錄音凫乖,去河邊找鬼。 笑死弓颈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的删掀。 我是一名探鬼主播翔冀,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼披泪!你這毒婦竟也來了纤子?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎控硼,沒想到半個(gè)月后泽论,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卡乾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年翼悴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔妨。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鹦赎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出误堡,到底是詐尸還是另有隱情古话,我是刑警寧澤蜀踏,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布梗夸,位于F島的核電站,受9級(jí)特大地震影響揽思,放射性物質(zhì)發(fā)生泄漏悉抵。R本人自食惡果不足惜肩狂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望基跑。 院中可真熱鬧婚温,春花似錦、人聲如沸媳否。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篱竭。三九已至力图,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掺逼,已是汗流浹背吃媒。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工吕喘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留募舟,地道東北人拱礁。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓吴超,卻偏偏與公主長得像鲸阻,于是被迫代替她去往敵國和親赘娄。 傳聞我的和親對象是個(gè)殘疾皇子遣臼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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