总结

一、常用的设计模式

1、代理模式

应用场景:当一个类的某些功能需要由别的类实现,但是又不确定具体是哪个类实现。
优势:解耦合
敏捷原则:开放-封闭原则
例子:
tableview、自定义代理。

2、观察者模式

应用场景:一般为model层对controller和view进行的通知方式,不关心谁去接收,只负责发布信息。
优势:解耦合
敏捷原则:接口隔离原则,开放-封闭原则
例子:
通知中心、KVO

3、单利模式

应用场景:确保程序运行期某个类,只有一份实例,用于进行资源共享控制。
优势:使用简单,延时求值,易于跨模块
敏捷原则:单一职责原则
例子:
[UIApplication sharedApplication]

4、工厂模式

应用场景:工厂方式创建类的实例,多与proxy模式配合,创建可替换代理类。
优势:易于替换,面向抽象编程,application只与抽象工厂和易变类的共性抽象类发生调用关系。
敏捷原则:DIP依赖倒置原则

二、算法

1、字符串反转
hello,word反转输出dorw,olleh。思路就是使用两个指针,一个指向头部begin,一个指向尾部end,遍历交换两个指针指向的字符,结束条件begin大于end。

void char_reverse(char * cha) {
    // 指向第一个字符
    char * begin = cha;

    // 指向字符串末尾
    char * end = cha + strlen(cha) - 1;

    while (begin < end) {
        // 交换字符,同时移动指针
        char temp = *begin;
        *(begin++) = *end;
        *(end--) = temp;
    }
}

2、链表反转
构建一个指定链表 1->3->8->5->4->2>11->14->12,并将其翻转打印。
思路:头插法实现链表反转。定义一个新的head指针作为链表的头部指针,定义一个P指针遍历链表,将每次遍历到的元素插入到head指针后。

3、链表和数组的区别
数组:数组需要一块连续的内存空间来存储, 对内存要求比较高。
链表:通过指针, 将一组零散的内存块串联起来使用。
链表类型 :单链表、双向链表、循环链表、双向循环链表

链表和数组的优缺点:
时间复杂度:
数组插入删除操作时间复杂度是 O(n)
链表插入删除操作时间复杂度是 O(1)

随机访问第 k 个元素
数组 : O(1)
链表: O(n)
4、树和二叉树
一种非线性结构。树是递归结构,在树的定义中又用到了树的概念。

你可能感兴趣的:(总结)