快手iOS面经

背景

过完年来北京之后,有准备看看机会,也是想了解下市场行情。简历没有投太多,只定向投了头条教育部门、抖音、快手、阿里,这些公司。头条和阿里的简历都没过,肯定是亮点太少吧。只有快手简历过了,快手是三轮技术面+一轮HR面,前两轮技术都比较顺利,到第三轮却栽了,很痛心o(╥﹏╥)o。目前就不考虑换工作了,等下半年再说了,接下来的时间再好好精炼一下。

快手是视频面试,不支持周末,但是可以选择晚上时间,我这几次都是定在了晚上九点。视频面试是通过牛客网进行的,以下是我还记得下来的各轮面试题,对于一些iOS基础知识就不做解答了。

一面

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

1
2
3
4
5
6
7
8
9
10
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,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
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
//我的方案
//func findDir(_ dir: String) -> [String]
//block方案
func findDir(_ dir: String, block: ((String) -> Bool))

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

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

总结

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

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

Runtime内存模型探究

Objective-C是一种通用、高级、面向对象的编程语言。它扩展了标准的ANSI C编程语言,将Smalltalk式的消息传递机制加入到ANSI C中。

可以这么理解,Objective-C = C + Runtime,Runtime是将C语言具有面向对象功能的推动剂,是iOS开发中的核心概念。我们可以在苹果开源的 runtime(当前的最新版本objc4-779.1.tar.gz)中可以发现一些 Objective-C 对象模型的实现细节。

VSCode配置Python版本

刚学习Python没多久,对VSCode也不是很熟悉,在一次解问题的过程中,加深了对这两者的印象,于是记录一下。

环境:Mac OS 10.15,VSCode 1.41.1

问题定位

我在尝试用VSCode写python爬虫,遇到一个问题ImportError: No module named requests

通过问题描述很容易知道问题,这是因为导入了requests库,但是VSCode却没有找到这个库。

2019年总结

好像随着年龄的增长,对时间的感知就变得越来越弱了。总感觉2019年还是一个很新鲜的年份,但它却已经走完了,2020年好像很遥远的样子,但它已经到来了。来个总结吧,2019年,这一年有太多的酸甜苦辣。从工作、生活和规划三个方面展开说吧。

工作

年初原项目组有一位很厉害的开发离职了,当时是我俩共同负责一个项目。他开发经验比我多,而且工作态度和习惯都很好,是我见过的未数不多让我称赞的程序员。曾经一起工作的将近一年多时间里,我都以他为学习榜样。对于他的离职,我纠结了很长一段时间,自认这是对我对公司的一大损失。

后来很长的时间里,一直都没有招到合适的人,我便一个人扛起了项目。很多之前应该是两个人一起商量的问题都需要自己一个人去思考解决方式,渐渐的我不断磨练自己的独立思考能力。大半年下来,突然感觉自己被逼着成长了许多,从一个崇拜别人,向别人学习的角色变成了一个不惧怕任何技术难题,能够帮助别人解决困难的角色。

2019年学会的第一个最重要的道理,很多时候有一个可以依赖的对象,是会减弱自己探索和尝试的动力,而开发很多时候对技能的理解和掌握,乃至个人进步,都是要依靠自己的探索获取的

OC项目转Swift指南

运行环境:Xcode 11.1 Swift5.0

最近参与的一个项目需要从Objective-C(以下简称OC)转到Swift,期间遇到了一些坑,于是有了这篇总结性的文档。如果你也有将OC项目Swift化的需求,可以作为参考。

OC转Swift有一个大前提就是你要对Swift有一定的了解,熟悉Swift语法,最好是完整看过一遍官方的Language Guide

转换的过程分自动化和手动转译,鉴于自动化工具的识别率不能让人满意,大部分情况都是需要手动转换的。

【译】iOS 架构模式--浅析MVC, MVP, MVVM 和 VIPER

作者:Bohdan Orlov
原文地址:https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52

在iOS开发过程中你是否对MVC的使用感觉很别扭?你是否对转向MVVM有疑惑?你听说过VIPER,但不清楚这个东西是否值得一试。

接着读下去,你会找到上面这些问题的答案。如果读完仍不能解惑,欢迎到评论区捶我。

接下来你将在iOS环境下构建关于架构模式的知识体系。我们将简要构建一些经典的例子,并在理论和实践上进行比较他们的不同。如果你需要更多关于任何一个特定的细节,请关注我。

感谢大家的帮助

好消息

开始水滴筹之后,父亲治病的消息大家就都知道了,期间收到了很多来自亲友的支持和帮助。先告诉大家好消息,父亲手术完了,并且身体恢复一切正常,已于11月8号中午从重症监护室转到无菌病房,还需要在里面待够五天才转到普通病房。关于看病所需要的筹款,也得到了解决。今天晚上7点左右,我已经终止了这次筹款。

看病资金问题能快速解决,除了来自水滴筹的筹款,还有就是公司的大力支持。三位老板帮助了2万元,还破格提前给我发了年终奖,算上水滴筹中的63588元,一直到出院应该是没什么问题了。

关于水滴筹

很多朋友因为我的原因关注并参与到水滴筹中,有些小伙伴因为担心水滴筹有手续费用就直接把钱打给我。为了打消大家的顾虑,我花了些时间理解水滴筹背后的一些事情。

为什么会得尿毒症

看了父亲的病历,再结合之前了解的一些情况,我试着分析一下为什么会得尿毒症。

一些医学知识

关于肾脏:

肾脏有很重要的代谢排毒功能,可以清除体内经由食物消化所残留的尿素、尿素氮、肌酸酐等,也会排出水分,维持体内的电解质平衡,甚至是控制血压高低起伏、活化维生素 D 的重要器官。此外,肾脏与肝脏一样,也是体内清除药物的重要器官,这也是为何肾功能不好时,就容易发生药物过量或中毒后遗症的原因。可见肾脏是何等的重要!等到肾脏的功能持续恶化到只剩下不到正常的 10% 时,才较容易出现包括恶心、水肿、高血压、倦怠无力、抽筋等症状,一旦造成更严重的尿毒症时,只能透析治疗。

七院第三天(11月5号)

手术完成就是渡过了最大的难关,其他时间爸爸都是在重症监护室由专门护工照顾的。实际也不需要那么多人手,先后送走了三姨姨父,弟弟,还有两位叔叔,就我自己留在医院。平常需要买什么吃的,里面护士直接给我打电话,我买好送过来。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×