面试题总结


title: 面试题总结
date: 2016-03-8 14:05:32
tags:


前言:整理下面试遇到的题,都是个人整理。不确定对错,仅供参考。

1 block在调用时,变量的生命周期有哪几种?分别是什么样的?

_NSConcreteStackBlock 保存在栈中的block,出栈时会被销毁
_NSConcreteGlobalBlock 全局的静态block,不会访问任何外部变量
_NSConcreteMallocBlock 保存在堆中的block,当引用计数为0时会被销毁
局部变量block块被创建时,block被保存到栈中(_NSConcreteStackBlock)。当block作用域结束时,block会被释放掉。
全局静态变量blcok块被创建时,blcok被保存到全局静态block(_NSConcreteGlobalBlock)。
全局变量block块被创建时,会被从栈上copy到堆上(_NSConcreteMallocBlock)。包括__blcok修饰的对象。

感谢此博客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("一共计算%d次 \n", (len - 1) * 10 / 2);
    for (int m = 0; m < (sizeof(a) / 4); m++) {
        printf("%d \n", a[m]);
    }

3 链表
1 单向链表
// 结构体定义
struct ListNote
{
    int m_nValue;
    struct ListNote* m_pNext;
};

/**
 *  添加一个节点
 *
 *  @param pHead 结构体 指针的指针
 *  @param value 结构体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;
    }
}

/**
 *  删除一个节点
 *
 *  @param pHead 结构体指针的指针
 *  @param value 结构体value删除的值
 */
void removeNode(ListNote **pHead, int value)
{
    if (pHead == NULL || *pHead == NULL) {
        return;
    }
    
    ListNote *deleteNote;
    // 第一个结点m_nValue == value,deleteNote保留要删除的指针*pHead,并将子结点指针赋值给要删除的指针*pHead
    if ((*pHead)->m_nValue == value) {
        deleteNote = *pHead;
        *pHead = (*pHead)->m_pNext;
        
    } else {
        ListNote *pNode = *pHead;
        // 1 遍历链表,判断当前结点的下个结点的m_nValue不等于value,等于就跳出循环。
        while (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value) {
            pNode = pNode->m_pNext;
        }
        
        // 1 pNode有可能是中间的结点
        // 2 pNode有可能是倒数第二个结点。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;
    }
}

/**
 *  从尾到头打印结点
 *
 *  @param pHead 结构体 指针的指针
 */
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?
    
    // 插入节点到头部
    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
        }
    }
    
    // 根据key获取节点
    func getNode(noteKey noteKey:String) -> FWLinkedMapNode? {
        
        if let value = dic[noteKey] {
            return value
        }
        return nil;
    }
    
    // 移动节点到头部
    func bringNodeToHead(node node:FWLinkedMapNode) -> Void {
        
        if node == firstNode {
            return
        }
        if node == lastNode {
            // 保留最后一个节点
            lastNode = node.head
            lastNode?.next = nil;
            // 新node下个节点
            node.next = firstNode;
            // 第一个node上个节点(新节点)
            firstNode?.head = node;
            // 第一个新节点无上个节点
            node.head = nil
            // 保留第一个
            firstNode = node;
        } else {
            node.head!.next = node.next
            node.next!.head = node.head
            // 第一个node上个节点(新节点)
            firstNode!.head = node;
            // 第一个新节点无上个节点
            node.head = nil;
            // 新node下个节点
            node.next = firstNode;
            // 保留第一个
            firstNode = node
        }
    }
    
    // 移除尾节点
    func removeTailNode() -> Void {
        dic[lastNode!.key!] = nil
        lastNode = lastNode?.head;
    }
    
    // 移除所有节点
    func removeAll() -> Void {
        firstNode = nil;
        lastNode = nil;
        dic.removeAll()
    }
}
4 二分查找算法

一次面试被问到如何从数组里快速找到某个值。傻呼呼的说for循环,😄。
二分查找对数组要求是有序的排列,思路摘录下此博客 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 查找的有序数组
 *  @param len   数组长度
 *  @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用到了什么数据结构和算法

据我所知 数据结构:哈希表 算法:哈希算法。哈希算法是哈希算法的统称,其中包括除于算法什么的。

6 快速排序

快速排序是对冒泡法排序的一种改进。思想就是将数组看成左右2部分。以一个基准数,一般是数组索引下标为0的数。如将小的扔到左边,大的扔到右边。并且移动最大和最小索引变量,然后在重复排序数组左边,右边。最终得到有序数组,就理解这么多,上代码。

int partition(int arr[], int low, int high){
    int key;
    // 变量key
    key = arr[low];
    while(low<high){
        // 数组右侧与key比较,大于的话,左移high索引
        while(low <high && arr[high]>= key ) {
            high--;
        }
        // 右边某值小于key,赋值给key。并low++
        if(low<high)
            arr[low++] = arr[high];
        // 数组左侧与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){
        // 分割数组左右2部分。
        pos = partition(arr, start, end);
        // 分割处理数组左部分
        quick_sort(arr,start,pos-1);
        // 分割处理数组右部分
        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;
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 本篇文章将主要介绍普通类型与对象在内存中储存方式的不同,也正因为这种不同,导致普通类型和对象在JS的使用中存在着一...
    宣泽彬阅读 443评论 0 0
  • 序列化二叉树所谓的序列化指的是把树的值,按照前序或者后序序列,变成一个字符串;反序列化就是字符串变成一个树结构; ...
    hayes0420阅读 128评论 0 0
  • 匮乏就是觉得什么都不够多,不够好,总之就是不够。丰盛的感觉源点就是觉得现在已经很好,将来会更好。 针对睡眠这个问题...
    海峰心中花海阅读 174评论 0 0
  • 时间:2013年10月13日主题:【TED】医生也会犯错误 @布莱恩高德曼感想:“每个医生都会犯...
    翱翔GTD阅读 518评论 0 1
  • 一 提到当前的大学生,似乎已经成为了社会上人人恨铁不成钢的对象:逃课、熬夜打游戏、上课睡觉......网上一片片爆...
    咩的一声羊叫阅读 340评论 0 4