常见-最新iOS面试真题总结

前言

近期的iOS面试求职算是经历了一波小高潮,话不多说,直接切入正题,下面是我最新总结的某些大厂以及小公司的面试题!

目录

  • 1、iOS 基础题
  • 2、iOS 实战题
  • 3、网络题
  • 4、计算机系统题
  • 5、设计模式题
  • 6、架构 & 设计题
  • 7、数据结构&算法题
  • 8、额外补充

1、iOS 基础题

1,分类和扩展有什么区别?可以分别用来做什么?分类有哪些局限性?分类的结构体里面有哪些成员?

2,讲一下atomic的实现机制;为什么不能保证绝对的线程安全(最好可以结合场景来说)?

3,被weak修饰的对象在被释放的时候会发生什么?是如何实现的?知道sideTable么?里面的结构可以画出来么?

4,Autoreleasepool 所使用的数据结构是什么? AutoreleasePoolPage 结构体了解么?

5,讲一下对象,类对象,元类,跟元类结构体的组成以及他们是如何相关联的?为什么对象方法没有保存的对象结构体里,而是保存在类对象的结构体里?

6,iOS 中内省的几个方法? class 方法和 objc_getClass 方法有什么区别?

7,RunLoop的作用是什么?它的内部工作机制了解么?(最好结合线程和内存管理来说)

8,哪些场景可以触发离屏渲染?(知道多少说多少)

2、iOS 实战题

1,有哪些场景是NSOperation比GCD更容易实现的?(或是NSOperation优于GCD的几点,知道多少说多少)

2,App 启动优化策略?最好结合启动流程来说(main()函数的执行前后都分别说一下,知道多少说多少)

3,App 无痕埋点的思路了解么?你认为理想的无痕埋点系统应该具备哪些特点?(知道多少说多少)

4,你知道有哪些情况会导致app崩溃,分别可以用什么方法拦截并化解?(知道多少说多少)

5,你知道有哪些情况会导致app卡顿,分别可以用什么方法来避免?(知道多少说多少)

3、网络题

1,App 网络层有哪些优化策略?

2,TCP为什么要三次握手,四次挥手?

3,HTTPS的握手流程?为什么密钥的传递需要使用非对称加密?双向认证了解么?

4,HTTPS是如何实现验证身份和验证完整性的?

5,如何用Charles抓HTTPS的包?其中原理和流程是什么?

4、计算机系统题

1,了解编译的过程么?分为哪几个步骤?

2,静态链接了解么?静态库和动态库的区别?

3,static和const有什么区别?

4,什么时候会出现死锁?如何避免?

5,有哪几种锁?各自的原理?它们之间的区别是什么?最好可以结合使用场景来说

5、设计模式题

1,除了单例,观察者设计模式以外,还知道哪些设计模式?分别介绍一下

2,iOS SDK 里面有哪些设计模式的实践?

3,设计模式的成员构成以及工作机制是什么?

6、架构 & 设计题

1,MVC和MVVM的区别?MVVM和MVP的区别?

2,面向对象的几个设计原则了解么?最好可以结合场景来说。

3,可以说几个重构的技巧么?你觉得重构适合什么时候来做?

4,你觉得框架和设计模式的区别是什么?

5,看过哪些第三方框架的源码,它们是怎么设计的?设计好的地方在哪里,不好的地方在哪里,如何改进?(这道题的后三个问题的难度已经很高了,如果不是太N的公司不建议深究)

7、数据结构&算法题

1,链表和数组的区别是什么?插入和查询的时间复杂度分别是多少?

2,哈希表是如何实现的?如何解决地址冲突?

3,排序题:冒泡排序,选择排序,插入排序,快速排序(二路,三路)能写出那些?

4,链表题:如何检测链表中是否有环?如何删除链表中等于某个值的所有节点?

5,数组题:如何在有序数组中找出和等于给定值的两个元素?如何合并两个有序的数组之后保持有序?

6,二叉树题:如何反转二叉树?如何验证两个二叉树是完全相等的?

8、额外补充

  • 1.详细描述一下UI View与 ALAyer的关系draw Rect一定会影响性能吗? UI Dynamics与UIKit Animation的最本质区别是什么?

  • 2.如何用 UllmageView显示超大分辨率的图?如果要支持缩放呢?

  • 3.了解 fishhook吗?说说为什么 fishhook不能修改非动态连接库中的符号?

  • 4.C++调用虚方法与 Objective-C发消息有什么区别?

  • 5.了解 placement new吗? Objective-C中如何实现这个功能

  • 6.如何在ARC环境下用C++标准库容器来管理Objective-C对象?

  • 7.id、sef、 super它们从语法上有什么区别?

  • 8.isa是什么?是指向Cass对象本身的指针吗?

  • 9.block修改捕获变量除了用 block还可以怎么做?有哪些局限性?

  • 10.NSDictionary与 NSHashTable有什么区别,它们的使用场景是怎样的?

  • 11.用过Swit吗?如何评价 String index的设计?

  • 12.假设 iPhone上有一个与服务器的TCP连接,此时 iPhone忽然断网,服务器能在短时间内知会 iPhone的离线吗?

  • 13.为什么 Wireshark不能直接抓取SSL的原始数据?

  • 14.backtrace是在用户态实现的吗?能否讲讲实现它的大致思路?

  • 15.malloc的指针 double free产生的异常与访问freed指针有可能产生的异常有什么区别?为什么访问 freed指针不一定产生异常?

  • 16.RunLoop是一个不停歇在运行的死循环吗?为什么?

  • 17.看过 runtime的源码吗?源码中常有的fastpath、 flowpath是什么?

  • 18.runtime中 SideTable(不是 SideTable)存在的意义是什么

  • 19.Objective-C是如何保证系统升级后的AB稳定性的?

结语

iOS面试中刷题只是一方面准备,但是,好的面试机会,离不开技术的支持,在找工作的同时,不要忘记提升自身技术,希望求职中的iOS开发者,找到一份自己满意的工作!

阿里-最新iOS面试真题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

阿里

一面

1、介绍项目

2、在KVO中,他是怎么知道监听的对象发生了变化?

3、字典的工作原理 ?怎100w个中是怎么快速去取value?

4、一个上线的项目,知道这个方法可能会出问题,在不破坏改方法前提下,怎么搞?

5、Block和函数指针的区别?

6、性能优化

7、YYModel和AF源码

8、如何自己设计json转model

9、架构

他们的面试官好像都爱问一下底层的东西,比如这次面试上来机会问我KVO的问题。 问题【1】,看着好像很吊的样子,仔细一样不去思考,可能还真不是太了解, 问题【2】,这个就是纯纯的数据结构的问题了。 问题【3】,这个就是iOS的runTime的问题了,要只要isa,和一些swizzling技术 问题【4】,就是看你了解有多广泛了。

二面

1、浅拷贝和深拷贝的区别

2、Block的循环引用、如何解决、原理

3、Block和delegate的比较

4、kvo的实现原理

5、Autorelease pool的实现原理

6、消息转发机制

7、线程死锁的四个条件

8、进程和线程的区别

9、持久化

10、事务的特征 中途还讨论了Masonry的约束应该写在哪里,我说应该写在layoutSubViews,他说会调用多次,然后争论了一会儿

三面

主要问了项目的一些东西 和给一些场景问我如何实现

自我介绍 介绍一些项目难点

主线程是相对于什么而言的

一张图片的内存占用大小是由什么决定的

索引的作用

索引的优缺点

在数组中找最小的k个数

淘宝下拉加载更多如何优化

淘宝页面发送HTTP请求的过程

介绍一下MVVM

知道哪些设计模式

三面面试官主要就聊了一些具体场景问题和一些基础,基础应该是没太大问题。

虎牙-最新iOS面试真题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

  • 一面
  1. 项目架构,项目是自己写的吗

  2. fps是怎么计算的

  3. 除了用cadisplay,还有什么方法吗

  4. kvo怎么实现

  5. leaks怎么实现

  6. 如何代码实现监听僵尸对象

  7. imageWithName什么时候发生编解码,在什么线程

  8. isa指针里面有什么

  9. 消息发送和消息转发流程

  10. 函数里面的参数怎么存储

  11. oc一个空函数里面有参数吗

  12. 他们存在栈还是寄存器

  13. 红黑树等查找时间复杂度

  14. nsdictionary的实现

  15. iOS的各种锁

  16. 如何实现dispatch once,要考虑什么问题

  17. 同一线程里面使用两个@synconize会怎么样,是递归锁还是非递归锁

  18. 如何增加按钮点击范围

  • 二面
  1. 说一下ARC

  2. autoreleasepool可以用来干嘛

  3. 里面的对象什么时候释放,是出来就释放吗

  4. 消息转发可以用来干什么

  5. runloop是干什么,你用来干什么了

  6. 说一下C++多态和虚函数表

  7. TCP如何保证数据传输完整性

  8. TCP为什么三次握手

  9. http和https,全程都是非对称加密吗

  10. 开放性问题,很多乱序数据过来,你要怎么考虑排序方法的设计

  11. 对RxSwift的看法,有用过吗?

  • 三面
  1. iOS对象指针大小

  2. 对象分配到堆还是栈

  3. http怎么区分header和body

  4. 多线程可以访问同一个对象吗,多进程呢

  5. 视频pts和dts

  6. 视频丢帧丢哪个好点

  7. iOS各种锁的性能,琐是毫秒级别还是微妙级别

  8. http请求是异步还是同步

  9. 怎么看待rn和flutter

腾讯-最新iOS面试真题总结

一面

1、介绍一下实习的项目,任务分工,做了哪些工作?介绍实习内容

2、网络相关的:项目里面使用到什么网络库,用过ASIHTTP库吗

3、断点续传怎么实现?需要设置什么?

4、在杭州HTTP请求服务器响应快,可能离服务器距离近,而在深圳访问就很慢很慢,会是什么原因?如果用户投诉,怎么分析这个问题?

5、HTTP请求的哪些方法用过?什么时候选择get、post、put?

6、TCP建立连接的过程,断开连接的过程,为什么是四次握手?

7、项目里面的数据存储都用了哪些?知道iOS里面有哪些数据存储方法?什么时候该用哪些方法存储?

8、MVVM如何实现绑定

9、block和通知的区别,分别适用什么场景

10、算法。连续问了好几个,都是数组,层层递进的,但是我忘了,只记得最后是找出数组中重复的数字

11、进程和线程的区别

12、程序在运行时操作系统除了分配内存空间还有什么

13、进程间通信的方式

14、如何检测应用是否卡顿

15、发布出去的版本,怎么收集crash日志?不使用bugly等第三方平台或者这些第三方平台是怎么收集crash日志的?

16、在block里面使用_property会造成循环引用吗?怎么解决?除了使用self->_property,可以使用valueforkey来访问吗 在block里面可以修改它的值吗setvalueforkey?可以修改它的值,可以用valueforkey来解决,显式的的使用self,block外先持有self的弱引用。

二面

1、OC中对象的结构

2、多态

3、Ping是什么协议

4、知道MTU吗

5、ARC和MRC的本质区别是什么?

6、NSThread,GCD,NSOperation相关的。开启一条线程的方法?线程可以取消吗?

7、子线程中调用connection方法,为什么不回调?因为没有加入runloop,执行完任务就销毁了,所以没有回调。

8、MVC和MVVM的区别

9、了解哪些设计模式

10、存一个通讯录,包括增删改查,用什么数据结构

11、autorelease变量什么时候释放?手动添加的是大括号结束的时候释放,系统自动释放是在12、当前runloop循环结束的时候

13、那子线程中的autorelease变量什么时候释放?

14、子线程里面,需要加autoreleasepool吗

15、GCD和NSOperation的区别?

16、项目里面遇到过死锁吗?怎么解决?数据库访问本来就是线程安全的,不会造成死锁啊。什么是死锁?

17、Viewcontroller的生命周期?

18、在init方法里面,设置背景颜色,会生效吗 会生效。为什么会?

19、WWDC2016公布了哪些新特性?对苹果系列的最新特性有关注吗

20、看过哪些源码,讲讲思路

21、两个链表找第一个相同结点

22、字符串旋转

23、找链表的倒数第k个结点

24、把一个链表比某个值大的放在左边,比它小的放在右边

25、二叉树的中序遍历,非递归

美团-最新iOS面试真题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

美团

一面

1、简历上写的项目问了一遍,然后开始问知识点。

2、volley的源代码,在图片缓存部分讨论了挺长时间,http中缓存机制,

3、视觉控制器的生命周期

4、数据库

5、多线程(NSTread、NSOPeration、GCDA+block)

6、http协议get post的区别

7、手机适配一些方案

8、真机调试、项目上线注意事项

9、静态方法是否能被重写 这些大概聊了1个半小时,开始的时候还有些紧张,慢慢聊开了,就好多了,面试官的语速有点快,老是需要面试官重复一遍,我也不经意间语速也变快了,不过能看出来面试官还是很厉害的。

二面

1、id和nill代表什么(nill和NULL的区别)

2、向一个nill对象发送消息会发生什么?

3、http中的同步和异步

4、MVC 和 MVVM 的区别。 用 MVVM 实现一个业务。VC 是入口,VC1 显示 “省” 的列表,VC2 显示省关联的 “市” 的列表,VC3 显示市关联的 “县” 的列表。VC 到 VC1,VC1到 VC2,VC2 到 VC3,VC3 再跳转到 VC。相关点在于如何设计 ViewModel 和 Model ,以及 VC3 到 VC。 如何编写单元测试,比如写了一个网络库,如何测试该网络库,用例怎么写的更全面一些。 代码从 Git 上拉下来到生成 .ipa 都有哪些过程,期间都生成了什么文件。 最近读过哪些书,看过哪些框架,有什么收获。 谈到 JSPatch,问 JSPatch 是如何处理 Block 的。 自己擅长的地方。 遇到过什么样的挫折。

新增二面被问到的问题:如果没有instruments,该如何检测memory leak, zombie object 之类的问题。

三面

1、iOS是如何进行资源管理的。

2、Python比较重要的几个特性

3、网络五层结构,每一层协议,由于我网络不是很好,还问了一些其他的问题(例如MAC地址和ip地址的区别等)。

先谈了下前两面的感受和问题,又和面试官聊到了单例和全局变量的区别。 Block和Protocol的区别,Block是为了解决什么问题而使用的。 iOS 的设计模式。iOS 为什么没有类似于 Java 和 C 之类的 “Builder” 的构造模式。 冒泡、插入、快速排序的平均时间复杂度和最坏时间复杂度。

堆排序。 有时间复杂度为 O(n) 的排序吗? 最近从 stackOverFlow 上解决过的问题,读过的开源框架,读过的书,业余兴趣,最有成就感的事情。

百度-最新iOS面试真题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

百度

一面

1、iOS基础知识

2、Python基础知识,大概是多线程,线程安全,集合类,JVM,类相关知识等。

3、iOS一些源码的阅读

4、优秀的第三方框架源码阅读

5、GLSurfaceView的相关知识,OpenGL,Shader,绘制流程。

6、询问当前做的项目,以及到具体的实现和优化。

7、多进程间的通讯,Binder机制。

8、询问看过哪些框架源码,EventBus,Volley讲了一下。

二面

1、Delegate 、Notification和KVO比较各自的优缺点

2、在一个UI的正中间实现一个正方形的红色视图有几种方式?

3、手触碰到屏幕的时候,响应机制是怎样的?第一响应者是谁?追问 UIView和UIResponse的关系是什么?

4、UIViewController的生命周期是什么?追问 UIViewController 只alloc而没用到的时候,

5、UIViewController 的view是否加载了?如果没有加载那什么时候加载? 直接用UILabel和自己用DrawRect画UILabel,哪个性能好?为什么?哪个占用的内存少?为什么?

6、AFNetworking是否支持ipv6?

7、项目采用64位,为什么要用64位?怎么修改成64位?i386是什么?他们有什么关系?

8、iOS的应用程序有几种状态?追问,退到后台代码是否可以执行?双击home键,代码是否可以执行?

9、一般使用的图标内存为多大?比如200×300的图片,内存应该占用多少比较合理?

10、说说你对内存泄漏的看法,追问,block为什么容易引起内存泄漏?

11、[object copy]是浅拷贝还是深拷贝?为什么是浅拷贝?copy是实现了哪个协议?

12、Images.xcassets和直接用图片有什么不一样?

三面

全是问得iOS方面的问题,问得真的很细,需要基础很扎实,对各个机制真的足够理解,不然确实有点难回答。

1、内存管理方面的

2、多线程

3、各种队列

4、线程锁

5、MVVM 就是考察一下我iOS方面的能力到底是否有水分吧。问得很细,确实需要基础足够扎实才行。

拼多多-最新iOS面试真题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

一面

  1. JSON转模型如何实现;夜间模式;播放器架构设计

  2. 请求的过程

  3. 服务端返回格式除了json还有其他的吗?

  4. 哪些OC对象是线程安全的

  5. 为什么要在主线程更新UI

  6. 如何保证OC容器在多线程下的数据安全性

  7. SDWebImage的内存怎么设计的,更新原则是什么

  8. 两个算法题:

    1. 判断括号匹配性
    2. 只有一种括号,计算最少加多少个括号,使其满足匹配

二面

  1. +load和+initialize怎么理解的,什么时候会被调用,分别讨论父类重写而子类没重写的情况

  2. 怎么理解OC的动态性

  3. 介绍下消息转发机制,说一下这些过程中用到的系统api

  4. 怎么理解Block的

  5. Block的变量截获机制

  6. __block的实现原理

  7. 内存管理机制

  8. 用户点击屏幕,系统是怎么找到一个view并决定由它来响应事件的

抖音-最新iOS面试真题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

一面

  1. 最近公共父节点(两个节点,都可能为null,都可能不在树上。)

  2. 反转链表(常规题)

  3. HTTP了解吗?HTTP2.0介绍下

  4. iOS9-13,每个版本讲一个特性

  5. 怎么实现多个任务执行完后,再统一处理(应该是同步阻塞、栅栏函数、调度组)

  6. 不让用SDWebImage,如何实现类似逻辑 (自己设计图片请求和缓存,简单讲了SDWebImage的思路)

  7. 每个TableViewCell都有一个UIImageView要加载图片,如果没有缓存,有五个Cell请求一个url,同时发请求肯定是不实际的,如何处理?

  8. 微信TableView滑动的时候,动图是不动的,为什么?(Runloop的Mode决定的)

  9. 有了解过WebSocket吗?

二面

  1. 如何不试用递归,打印所有一个UIView所有的subviews

  2. 设计一个图片缓存系统,并代码实现

  3. 介绍基于LLVM/Clang的静态分析

  4. 七层协议栈

  5. HTTP是哪一层的协议

  6. HTTP常见的返回码有哪些?

  7. HTTP除了GET、POST还有哪些?(UPDATE、DELETE、HEAD)

  8. HTTPS介绍一下

  9. HTTPS能防止中间人攻击吗?

  10. TCP和UDP的区别

  11. 线程和进程的区别

  12. 线程之间如何进行通讯

  13. 不使用gcd,如何保证线程安全?

  14. iOS有哪些多线程方式?(NSOperation、NSThread、GCD)

  15. 同步和异步有什么区别?

  16. 串行队列和并行队列有什么区别?

  17. 队列和线程的关系

  18. 死锁是怎么产生的?

三面

  1. 合并排序链表

  2. HTTPS用的对称加密还是非对称加密?

  3. TCP的慢启动,快恢复介绍下

  4. 客户端发送网络请求,到拿到响应的整个过程 (类似打开一个网页的过程)

  5. 接上题,如果DNS解析的时候,某个ISP服务器没有了,这时候逻辑是怎样的?

  6. 介绍了下字典转模型的设计+夜间模式的设计

  7. 为什么不用成熟的字典转模型的三方?有了解过吗?

  8. 夜间模式有什么缺点,能怎么优化?

  9. 锁有哪些?

  10. 数据存储,怎么存的(FMDB)

  11. 线程安全错误是怎么出现的?

头条-最新iOS面试真题总结

关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教。主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧。

头条

一面

1、自我介绍

2、项目相关

3、怎么自定义导航跳转

4、谈谈runtime的理解

5、KVC的用途

6、使用method swizzling要注意什么?(进行版本迭代的时候需要进行一些检验,防止系统库的函数发生了变化)

7、谈对引用计数的理解

8、谈谈runloop的理解

9、runloop有哪些状态

10、autoreleasepool的使用场景

11、TableView优化,怎么减少卡顿

12、copy assign retain weak关键词

13、JSON转Model

14、代码布局

15、多屏幕适配

16、HTTP请求头和响应头

17、Cookie

18、NSCache

19、自己设计一个缓存器

20、怎么实现LRU

21、SDWebImage

22、二叉树先序遍历(递归和非递归)

二面

1、MVC的一些缺点

2、讲一讲其它架构

3、你知道哪些编码方式

4、算法字符串翻转

5、多线程的方式和它们的区别

6、队列和线程的关系

7、一道线程安全的题

8、有哪些锁

9、属性的关键字

10、assign可以用于OC对象吗

11、copy和strong的区别

12、weak如何实现自动赋nil

13、为什么不可变对象要用copy

14、assing可以使用在对象中吗

15、Pod update和pod install的区别

16、layoutIfNeeded和setNeedsLayout的区别

17、抓包工具抓取HTTPS的原理

18、isEquel和hash的关系

19、bitmap的结构

20、可变数组的实现原理

21、如何hook一个对象的方法,而不影响其它对象

22、如何避免if else

23、自旋锁和互斥锁的区别

三面

1、介绍项目,主要介绍自己强项一点的地方

2、数组cop后里面的元素会复制一份新的吗

3、数组的浅拷贝与深拷贝

4、TCP为什么是三次握手和四次挥手

头条一直都是视频面,而且是一条龙服务。总体来说感觉不错,反正主要就是需要基础足够扎实;

快手-最新iOS面试真题总结

背景

面的是快手X3岗位,视频面试,不支持周末,但是可以选择晚上时间。视频面试是通过牛客网进行的,以下是记下来的各轮面试题,对于一些iOS基础知识就不做解答了。

一面

1、用递归写一个算法,计算从1到100的和。

1
2
3
4
5
6
7
8
9
10
11
func sum(value: Int) -> Int {
if value <= 0 {
return 0
}
var number = value
return value + sum(value: number - 1)
}
// 计算过程
let result = sum(value: 100)
print(result)
复制代码

写完算法之后又围绕着问了几个问题,都是算法基础:

  • 算法的时间复杂度是多少
  • 递归会有什么缺点
  • 不用递归能否实现,复杂度能否降到O(1)

2、property的作用是什么,有哪些关键词,分别是什么含义?

3、父类的property是如何查找的?

4、NSArrayNSDictionary应该如何选关键词?

5、copymuteCopy有什么区别,深复制和浅复制是什么意思,如何实现深复制?

6、用runtime做过什么事情?runtime中的方法交换是如何实现的?

7、讲一下对KVC合KVO的了解,KVC是否会调用setter方法?

8、__block有什么作用

9、说一下对GCD的了解,它有那些方法,分别是做什么用的?

10、对二叉树是否了解?

面试官是想接着问这方面的问题的。我当时说了不了解,然后就没有后续了。

二面

1、ARC和MRC的区别,iOS是如何管理引用计数的,什么情况下引用计数加1什么情况引用计数减一?

2、在MRC下执行[object autorelease]会发生什么,autorelease是如何实现的?

3、OC如何实现多继承?

这个当时没有答好。其实借助于消息转发,protocol和类别都可以间接实现多继承。

4、对设计模式有什么了解,讲一下其中一种是如何使用的。

5、有没有哪个开源库让你用的很舒服,讲一下让你舒服的地方。

6、一张100*100,RGBA的png图像解压之后占多大内存空间。

5、算法题

题目:给定一个个数字arr,判断数组arr中是否所有的数字都只出现过一次。

这个并没有要求写出来,说是提供思路就行了。我当时给的方案是在便利数组的时候,用一个字典把便利的元素存起来,如果在后面的便利过程中新元素在字典中存在过就说明,有重复数字出现。时间复杂度是O(n)。

当时也问了有没有办法进行优化,我当时想到了将数组转成Set,然后和原数组比较,两个集合的数量是否变化。

7、因为我跟他介绍自己Swift用的多一些,然后问了些Swift跟OC的区别,各自的优缺点。

8、为什么离职,有什么职业规划。

三面

1、给定一个Int型数组,用里面的元素组成一个最大数,因为数字可能非常大,用字符串输出。

1
2
3
输入: [3,30,34,5,9]
输出: 9534330
复制代码

这个是leetcode的179题,难度中等。面试官让先说思路,再去做题。事先说一下这个题我没有做过。当时的思路是用冒泡法进行排序,排序的前提是将较少位数的数字进行循环补齐,例如3和30的比较,变成33和30的比较,34和4的比较变成34和44的比较,然后将结果从大到小整合成字符串输出。

但是做题是却发现没那么简单,位数的补齐对于2位和3位数的比较还需要求位数的最小公倍数,将他们都转成6位数才能比较。在挣扎了5分钟做了就做罢了。

后来再去做这道题,其实这就是一个排序而已,只不过他的规则是按高位优先级更高的原则,而这一点跟字符串的比较保持一致,如果再加一些Swift的高阶函数,就可以写成:

1
2
3
4
5
6
7
8
9
10
11
12
func largestNumber(_ nums: [Int]) -> String {
let sort = nums.map {"\($0)"}.sorted { (lStr, rStr) -> Bool in
return lStr + rStr > rStr + lStr
}
let result = sort.joined()
if result.prefix(1) == "0" {
return "0"
} else {
return result
}
}
复制代码

2、项目中有这么一个方法func findfile(dir: String suffix: String) -> [String] ,可以通过输入文件夹目录,和后缀检索出所需的文件。

例如需要在某个文件中检索txt文件或者mp4文件,那就传入dir和suffix就行了。现在又有一些需求,例如需要检索utf8格式的txt或者h264编码的mp4,也会有一些例如查找最近一周更新过的文件这样的需求,你如何优化这个类,让它满足这些情况?

我首先想到的是这么多需求不可能一个方法就完成,需要根据不同场景拆出不同的方法,但是这些同属于文件操作,会有一个共同使用的方法就是检索文件。这个方法需要传入文件目录,然后递归的返回当前目录所有文件路径。外部不同场景的调用逻辑就用一个enum完成,不同值对应相同范围的不同种类。

面试官比较关注内部共用的文件检索怎么写,他说子文件如果过多怎么办,如何优化。我有点懵,查找文件至少是要遍历一遍的,子文件过多,这个应该是没法优化的啊。中间卡了一段时间,后来他给了提示说是不是可以用block实现,将文件路径返回出去,由外部决定当前文件是否可用,最终外部的调用类是这个样子。

1
2
3
4
5
//我的方案
//func findDir(_ dir: String) -> [String]
//block方案
func findDir(_ dir: String, block: ((String) -> Bool))
复制代码

我想来确实没毛病,用block返回内容至少不会将该目录的所有文件都由一个对象持有,而前面一堆的铺垫其实也都是为验证block方案的好处。

其实事后想下这个问题没啥难的,这种写法自己也有写过,但当时就是没想起来,可能前面一圈的铺垫给我带偏了吧,说亏也不亏,以后多多努力吧。

总结

整体来看,快手的面试题跟我在别处看到的iOS面试题对比要简单些。一面主要是基础知识,二面考察更全面一些,更多让自己谈一些对技术的理解,三面则是更偏实践一些。

算法虽然三轮都有,但相对比较简单,即使写不出来,有思路也是可以的。当然写出来肯定是加分项,所以大家准备面试时,应该都看一下。算法相关的,排序,数组,二叉树,这几类是重点。