一、常用的设计模式
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、树和二叉树
一种非线性结构。树是递归结构,在树的定义中又用到了树的概念。
网友评论