面試題總結(jié)


title: 面試題總結(jié)
date: 2016-03-8 14:05:32
tags:


前言:整理下面試遇到的題,都是個(gè)人整理。不確定對(duì)錯(cuò)煞肾,僅供參考。

1 block在調(diào)用時(shí)嗓袱,變量的生命周期有哪幾種籍救?分別是什么樣的?

_NSConcreteStackBlock 保存在棧中的block渠抹,出棧時(shí)會(huì)被銷毀
_NSConcreteGlobalBlock 全局的靜態(tài)block蝙昙,不會(huì)訪問任何外部變量
_NSConcreteMallocBlock 保存在堆中的block,當(dāng)引用計(jì)數(shù)為0時(shí)會(huì)被銷毀
局部變量block塊被創(chuàng)建時(shí)梧却,block被保存到棧中(_NSConcreteStackBlock)奇颠。當(dāng)block作用域結(jié)束時(shí),block會(huì)被釋放掉放航。
全局靜態(tài)變量blcok塊被創(chuàng)建時(shí)烈拒,blcok被保存到全局靜態(tài)block(_NSConcreteGlobalBlock)。
全局變量block塊被創(chuàng)建時(shí),會(huì)被從棧上copy到堆上(_NSConcreteMallocBlock)荆几。包括__blcok修飾的對(duì)象吓妆。

感謝此博客http://www.cocoachina.com/ios/20150106/10850.html

2 冒泡排序

上次面試被問到冒泡排序。工作中涉及到算法比較少吨铸,都忘記了行拢。重新寫下。

int a[]={2,7,5,100,200, 4, 50, 23, 9, 10};
    int len = sizeof(a) / 4;
    for (int i = 0; i < len; i++) {
        for (int j = i + 1; j < len; j++) {
            if (a[i] > a[j]) {
                int tem = a[i];
                a[i] = a[j];
                a[j] = tem;
            }
        }
    }
    printf("一共計(jì)算%d次 \n", (len - 1) * 10 / 2);
    for (int m = 0; m < (sizeof(a) / 4); m++) {
        printf("%d \n", a[m]);
    }

3 鏈表
1 單向鏈表
// 結(jié)構(gòu)體定義
struct ListNote
{
    int m_nValue;
    struct ListNote* m_pNext;
};

/**
 *  添加一個(gè)節(jié)點(diǎn)
 *
 *  @param pHead 結(jié)構(gòu)體 指針的指針
 *  @param value 結(jié)構(gòu)體value值
 */
void addToTail(struct ListNote **pHead, int value)
{
    struct ListNote *pNew = new ListNote();
    pNew->m_nValue = value;
    pNew->m_pNext = NULL;
    
    if (*pHead == NULL) {
        *pHead = pNew;
    } else {
        ListNote *pNode = *pHead;
        while (pNode->m_pNext != NULL) {
            pNode = pNode->m_pNext;
        }
        pNode->m_pNext = pNew;
    }
}

/**
 *  刪除一個(gè)節(jié)點(diǎn)
 *
 *  @param pHead 結(jié)構(gòu)體指針的指針
 *  @param value 結(jié)構(gòu)體value刪除的值
 */
void removeNode(ListNote **pHead, int value)
{
    if (pHead == NULL || *pHead == NULL) {
        return;
    }
    
    ListNote *deleteNote;
    // 第一個(gè)結(jié)點(diǎn)m_nValue == value,deleteNote保留要?jiǎng)h除的指針*pHead诞吱,并將子結(jié)點(diǎn)指針賦值給要?jiǎng)h除的指針*pHead
    if ((*pHead)->m_nValue == value) {
        deleteNote = *pHead;
        *pHead = (*pHead)->m_pNext;
        
    } else {
        ListNote *pNode = *pHead;
        // 1 遍歷鏈表舟奠,判斷當(dāng)前結(jié)點(diǎn)的下個(gè)結(jié)點(diǎn)的m_nValue不等于value,等于就跳出循環(huán)房维。
        while (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value) {
            pNode = pNode->m_pNext;
        }
        
        // 1 pNode有可能是中間的結(jié)點(diǎn)
        // 2 pNode有可能是倒數(shù)第二個(gè)結(jié)點(diǎn)沼瘫。pNode->m_pNext->m_pNext為NULL,賦值給pNode->m_pNext
        if (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue == value) {
            deleteNote = pNode->m_pNext;
            pNode->m_pNext = pNode->m_pNext->m_pNext;
        }
    }
    // 銷毀
    if (deleteNote != NULL) {
        delete(deleteNote);
        deleteNote = NULL;
    }
}

/**
 *  從尾到頭打印結(jié)點(diǎn)
 *
 *  @param pHead 結(jié)構(gòu)體 指針的指針
 */
void fromTailToHeadPrintf(ListNote *pHead)
{
    if (pHead != NULL) {
        if (pHead->m_pNext != NULL) {
            fromTailToHeadPrintf(pHead->m_pNext);
        }
    }
    printf("%i \n", pHead->m_nValue);
}


struct ListNote *noteList = new ListNote();
    struct ListNote **noteList2 = &noteList;
    
    addToTail(noteList2, 5);
    addToTail(noteList2, 6);

//    printf("%i %i", noteList->m_nValue, noteList->m_pNext->m_nValue);
    
//    removeNode(noteList2, 6);
    
    fromTailToHeadPrintf(noteList);
    
//    printf("%i %i", noteList->m_nValue, noteList->m_pNext->m_nValue);

2 雙向鏈表
class FWLinkedMapNode: NSObject {
    var key: String?
    var value: String?
    var head: FWLinkedMapNode?
    var next: FWLinkedMapNode?
    init(key:String, value:String) {
        self.key = key;
        self.value = value;
    }
}

class FWLinkedMap: NSObject {
    
    var dic = Dictionary<String, FWLinkedMapNode>()
    var firstNode: FWLinkedMapNode?
    var lastNode: FWLinkedMapNode?
    
    // 插入節(jié)點(diǎn)到頭部
    func insertNoteAtHead(note note:FWLinkedMapNode) -> Void {
        
        if let akey = note.key {
            dic[akey] = note
        }
        if firstNode == nil {
            firstNode = note
            lastNode = note
        } else {
            firstNode?.head = note;
            
            note.next = firstNode;
            note.head = nil
            firstNode = note
        }
    }
    
    // 根據(jù)key獲取節(jié)點(diǎn)
    func getNode(noteKey noteKey:String) -> FWLinkedMapNode? {
        
        if let value = dic[noteKey] {
            return value
        }
        return nil;
    }
    
    // 移動(dòng)節(jié)點(diǎn)到頭部
    func bringNodeToHead(node node:FWLinkedMapNode) -> Void {
        
        if node == firstNode {
            return
        }
        if node == lastNode {
            // 保留最后一個(gè)節(jié)點(diǎn)
            lastNode = node.head
            lastNode?.next = nil;
            // 新node下個(gè)節(jié)點(diǎn)
            node.next = firstNode;
            // 第一個(gè)node上個(gè)節(jié)點(diǎn)(新節(jié)點(diǎn))
            firstNode?.head = node;
            // 第一個(gè)新節(jié)點(diǎn)無上個(gè)節(jié)點(diǎn)
            node.head = nil
            // 保留第一個(gè)
            firstNode = node;
        } else {
            node.head!.next = node.next
            node.next!.head = node.head
            // 第一個(gè)node上個(gè)節(jié)點(diǎn)(新節(jié)點(diǎn))
            firstNode!.head = node;
            // 第一個(gè)新節(jié)點(diǎn)無上個(gè)節(jié)點(diǎn)
            node.head = nil;
            // 新node下個(gè)節(jié)點(diǎn)
            node.next = firstNode;
            // 保留第一個(gè)
            firstNode = node
        }
    }
    
    // 移除尾節(jié)點(diǎn)
    func removeTailNode() -> Void {
        dic[lastNode!.key!] = nil
        lastNode = lastNode?.head;
    }
    
    // 移除所有節(jié)點(diǎn)
    func removeAll() -> Void {
        firstNode = nil;
        lastNode = nil;
        dic.removeAll()
    }
}
4 二分查找算法

一次面試被問到如何從數(shù)組里快速找到某個(gè)值。傻呼呼的說for循環(huán)握巢,??晕鹊。
二分查找對(duì)數(shù)組要求是有序的排列松却,思路摘錄下此博客 http://www.cnblogs.com/shuaiwhu/archive/2011/04/15/2065062.html

int main(int argc, const char * argv[]) {
    
    int lists[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    
    int value = 9;
    
    int result = binarySearch(lists, 10, value);
    printf("result:%d", result);
    
    return 0;
}

/**
 *  二分查找算法
 *
 *  @param lists 查找的有序數(shù)組
 *  @param len   數(shù)組長(zhǎng)度
 *  @param value 查找的值
 *
 *  @return 找到后的值
 */
int binarySearch(int *lists, int len , int value)
{
    int low = 0;
    int high = len - 1;
    while (low <= high) {
        int middle = (high - low) / 2 + low;
        if (lists[middle] == value) {
            return lists[middle];
        }
        // 左邊
        if (lists[middle] > value) {
            high = middle - 1;
        }
        // 右邊
        else {
            low = middle + 1;
        }
    }
    return -1;
}
5 NSDictionary用到了什么數(shù)據(jù)結(jié)構(gòu)和算法

據(jù)我所知 數(shù)據(jù)結(jié)構(gòu):哈希表 算法:哈希算法暴浦。哈希算法是哈希算法的統(tǒng)稱,其中包括除于算法什么的晓锻。

6 快速排序

快速排序是對(duì)冒泡法排序的一種改進(jìn)歌焦。思想就是將數(shù)組看成左右2部分。以一個(gè)基準(zhǔn)數(shù)砚哆,一般是數(shù)組索引下標(biāo)為0的數(shù)独撇。如將小的扔到左邊,大的扔到右邊躁锁。并且移動(dòng)最大和最小索引變量纷铣,然后在重復(fù)排序數(shù)組左邊,右邊战转。最終得到有序數(shù)組搜立,就理解這么多,上代碼槐秧。

int partition(int arr[], int low, int high){
    int key;
    // 變量key
    key = arr[low];
    while(low<high){
        // 數(shù)組右側(cè)與key比較啄踊,大于的話,左移high索引
        while(low <high && arr[high]>= key ) {
            high--;
        }
        // 右邊某值小于key刁标,賦值給key颠通。并low++
        if(low<high)
            arr[low++] = arr[high];
        // 數(shù)組左側(cè)與key比較,小于的話膀懈,右移low索引
        while( low<high && arr[low]<=key ) {
            low++;
        }
        // 左邊某值大于key,賦值給high索引顿锰。并且high左移索引
        if(low<high)
            arr[high--] = arr[low];
    }
    // low high索引相等,也是變量key的索引。
    // 將key賦值給low
    arr[low] = key;
    return low;
}

void quick_sort(int arr[], int start, int end){
    int pos;
    if (start<end){
        // 分割數(shù)組左右2部分硼控。
        pos = partition(arr, start, end);
        // 分割處理數(shù)組左部分
        quick_sort(arr,start,pos-1);
        // 分割處理數(shù)組右部分
        quick_sort(arr,pos+1,end);
    }
    return;
}

int main(int argc, char * argv[]) {
    int i;
    int arr[]={32,12,7, 78, 23,45};
    int len = sizeof(arr) / 4;
    
    printf("排序前 \n");
    for(i=0;i<len;i++)
        printf("%d\t",arr[i]);
    printf ("\n");
    
    quick_sort(arr,0,len-1);
    
    printf("\n 排序后 \n");
    for(i=0; i<len; i++)
        printf("%d\t", arr[i]);
    printf ("\n");
    return 0;
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乘客,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子淀歇,更是在濱河造成了極大的恐慌易核,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浪默,死亡現(xiàn)場(chǎng)離奇詭異牡直,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纳决,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門碰逸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阔加,你說我怎么就攤上這事饵史。” “怎么了胜榔?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵胳喷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我夭织,道長(zhǎng)吭露,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任尊惰,我火速辦了婚禮讲竿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弄屡。我一直安慰自己题禀,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布膀捷。 她就那樣靜靜地躺著迈嘹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪担孔。 梳的紋絲不亂的頭發(fā)上江锨,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音糕篇,去河邊找鬼啄育。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拌消,可吹牛的內(nèi)容都是我干的挑豌。 我是一名探鬼主播安券,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼氓英!你這毒婦竟也來了侯勉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤铝阐,失蹤者是張志新(化名)和其女友劉穎址貌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徘键,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡练对,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吹害。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片螟凭。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖它呀,靈堂內(nèi)的尸體忽然破棺而出螺男,到底是詐尸還是另有隱情,我是刑警寧澤纵穿,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布下隧,位于F島的核電站,受9級(jí)特大地震影響政恍,放射性物質(zhì)發(fā)生泄漏汪拥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一篙耗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宪赶,春花似錦宗弯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至欲主,卻和暖如春邓厕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扁瓢。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工详恼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人引几。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓昧互,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敞掘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • 本篇文章將主要介紹普通類型與對(duì)象在內(nèi)存中儲(chǔ)存方式的不同叽掘,也正因?yàn)檫@種不同,導(dǎo)致普通類型和對(duì)象在JS的使用中存在著一...
    宣澤彬閱讀 460評(píng)論 0 0
  • 序列化二叉樹所謂的序列化指的是把樹的值玖雁,按照前序或者后序序列更扁,變成一個(gè)字符串;反序列化就是字符串變成一個(gè)樹結(jié)構(gòu)赫冬; ...
    hayes0420閱讀 129評(píng)論 0 0
  • 匱乏就是覺得什么都不夠多疯潭,不夠好,總之就是不夠面殖。豐盛的感覺源點(diǎn)就是覺得現(xiàn)在已經(jīng)很好竖哩,將來會(huì)更好。 針對(duì)睡眠這個(gè)問題...
    海峰心中花海閱讀 176評(píng)論 0 0
  • 時(shí)間:2013年10月13日主題:【TED】醫(yī)生也會(huì)犯錯(cuò)誤 @布萊恩高德曼感想:“每個(gè)醫(yī)生都會(huì)犯...
    翱翔GTD閱讀 534評(píng)論 0 1
  • 一 提到當(dāng)前的大學(xué)生,似乎已經(jīng)成為了社會(huì)上人人恨鐵不成鋼的對(duì)象:逃課辽幌、熬夜打游戲增淹、上課睡覺......網(wǎng)上一片片爆...
    咩的一聲羊叫閱讀 351評(píng)論 0 4