一、概念
1、面向对象的特性?
1、封装:通过对象隐藏程序的具体实现细节,将数据与操作包装在一起,对象与对象之间通过消息传递机制实现互相通信
2、继承:继承是代码复用的基础机制
3、多态:多态发生在运行期间,相同的消息给予不同的对象会引发不同的动作
2、设计模式有哪些?
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。
使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。
一、创建型模式
单例模式:通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。
工厂模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
抽象工厂模式:围绕一个超级工厂创建其他工厂。
建造者模式:使用多个简单的对象一步一步构建成一个复杂的对象。
原型模式:实现了一个原型接口,用于创建当前对象的克隆。
二、结构型模式
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
组合模式
适配器模式
三、行为型模式
观察者模式
四、并发型模式
1、主动对象模式:对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为
3、面向对象的设计原则?
单一职责原则:一个类或一个模块应当只有一种职责
开闭原则:软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的
里式替换原则:程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换的
接口隔离原则:多个特定功能接口要好于一个宽泛用途的接口
依赖反转原则:高层次的模块不应该依赖于低层次的模块
二、数据结构
1、数组和链表的区别?
1、数组
地址连续,查找速度快,操作效率低
存储单元在定义时分配,元素个数固定,内存空间要求高
2、链表
地址不连续,查找速度慢,操作效率高
存储单元在程序执行时动态申请,可按需动态增减
2、iOS里有哪些地方用到了Hash表?
Hash Table,根据关键码值(Key value)而直接进行访问的数据结构。它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度
3、hash函数有哪些方法?
1、直接寻址法
2、数字分析法
3、平方取中法
4、折叠法
5、随机数法
6、除留余数法
优秀的Hash算法有以下原则
1、从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)
2、对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同
3、散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小
4、哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值
4、如何处理hash冲突?
不论哈希函数设计的如何完美,都可能出现不同的key经过hash处理后得到相同的hash值,这时候就需要处理哈希冲突。
哈希碰撞冲突,处理方法有很多,比如拉链法、线性探测法。
一、堆栈
1、堆栈的区别
堆和栈都是按序排列的数据结构,只能在一端对数据进行插入和删除
栈:
先进后出(FILO);
由编译器自动分配和释放;
空间较小,运行速度较快;
栈空间多线程不共享;
堆:
先进先出(FIFO);
一般需要手动分配和释放;
空间较大,运行速度较慢;
堆内存多线程共享;
三、算法
1、排序算法有哪些?
1.1、冒泡排序(Bubble Sort) O(n2) S(1)
核心思想:依次比较相邻的两个数,一次归位一个数
void bubble_sort(int array[], int length) {
int temp;
for (int i = 0; i < length - 1; i++) {
for (int j = 0; j < length - 1 - i; j++) {
if (array[j] > array[j + 1]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
for (int k = 0; k < length; k++) {
printf("%d ", array[k]);
}
printf("\n");
}
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int array[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
int length = (int) sizeof(array) / sizeof(*array);
bubble_sort(array, length);
for (int i = 0; i < length; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
return 0;
}
1.2、选择排序 O(n2) S(1)
核心思想:依次从未排序序列中找到最小元素,交换位置
void selection_sort(int array[], int length) {
int temp;
for (int i = 0 ; i < length - 1 ; i++) {
int min = i;
for (int j = i + 1; j < length; j++) {
if (array[j] < array[min]) {
min = j;
}
}
temp = array[i];
array[i] = array[min];
array[min] = temp;
for (int k = 0; k < length; k++) {
printf("%d ", array[k]);
}
printf("\n");
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int array[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
int length = (int) sizeof(array) / sizeof(*array);
selection_sort(array, length);
for (int i = 0; i < length; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
return 0;
}
1.3、插入排序 O(n2) S(1)
void insertion_sort(int array[], int length) {
int temp;
for (int i = 1;i < length;i++) {
temp = array[i];
int j = i - 1;
while((j >= 0) && (array[j] > temp)) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = temp;
for (int k = 0; k < length; k++) {
printf("%d ", array[k]);
}
printf("\n");
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int array[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };
int length = (int) sizeof(array) / sizeof(*array);
insertion_sort(array, length);
for (int i = 0; i < length; i++) {
printf("%d ", array[i]);
}
printf("\n");
}
return 0;
}
1.4、希尔排序 O(n log n)
1.6、快速排序
四、网络
1、输入一个URL到浏览器页面展示都经历了哪些过程?
1、DNS
2、TCP连接(三次握手)