美文网首页
ios面试日记 --- 腾讯一面

ios面试日记 --- 腾讯一面

作者: ShawnAlex | 来源:发表于2021-08-08 14:23 被阅读0次

    腾讯一面, 是在所有大厂之中是我不太满意的一次面试
    一方面的确是自己发挥有点问题, 一方面我觉得面试官的态度和面试技巧有点问题

    由于字节一面完背靠背面试腾讯, 我建议面试安排最好不要这样, 很累的。因为字节面试完就感觉被榨干了一样, 第二天感觉很累很乏。原因可能是

    • 年纪大了体力不好
    • 面试大厂的确要准备很多
    • 大厂面试很消耗体力
    • 面试完要进行复盘

    所以我以过来人经验不太建议背靠背面试2家大厂。

    问题1.介绍下自己

    问题2.介绍下自己做个的项目

    腾讯相比其他大厂不同, 开始就是一道算法题

    问题3.算法题: 找出最接近的数

    给定一个自增Int数组arr 以及 一个数k, 找到最接近数k的数字(数组中不包含k), 相同返回一个就行

    例如:
    arr = [1, 2, 5, 6], k = 4 返回 5
    arr = [2, 3, 4, 5], k = 1 返回 2
    arr = [2, 3, 5, 6], k = 4 返回 3, 5都可以

    题目不难, 第一反应遍历法, 循环判断数组arr中每一个值与k的绝对值, 找到最小绝对值直接返回。然后我觉得这种方法不太优雅, 要装个b, 用二分法写这道题。

    问题就在这个时候发生了, 当算法写完我这边需要传入参数验证一下算法是否正确。 结果腾讯算法面板跟其他面板运行不一样, 提示信息相比其他算法面板有点模糊无法定位具体问题在哪... 立即请求面试官, 结果面试官说他也不太清楚, 然后跟我一起研究面板问题

    第一反感

    贵公司自己开发的产品, 怎么能现场熟悉 ?

    最后原因找到swift调用方法要写在函数后面, 测试了一下提示 time out, 因为之前研究面板浪费了一些时间, 这个时候比较紧张。接下来发生了不愉快的事情。面试官开始一遍遍催, 快点做, 没剩多少时间了!

    第二反感

    通常算法面试(包括我面试别人), 给定一个时间, 中间不做任何发言, 问问题除外。时间到了结束算法题。最多可能5分钟结束前提示下面试者。

    而且这种行为类似: 项目中写了一个bug, 一个人在站在你后面, 一直指点, 一直念怎么还没解决, 怎么还没解决之类的。在紧张或者高压下给与干扰, 其实是程序员忌讳的一种行为。

    自我反思

    但其实后来想一想的确是自身问题, 如果真的强一遍验证就能过, 没有后续问题。或者不装直接用遍历法先保证运行成功, 时间空余再写二分。

    参考代码

    方法.1 遍历法

        func cal(_ arr:[Int], _ k:Int) -> Int {
    
            // 判断如果数在边界外直接返回对应边界值
            if arr.first! > k {
                return arr.first!
            }
            
            if arr.last! < k {
                return arr.last!
            }
    
            // 默认最小值, 
            var min_abs = abs(arr.first! - k), res = arr.first!
    
            // 遍历数组
            for i in arr {
    
                // 如果当前绝对值大于最小值, 说明, 上一步查找的即为最近的的数
                if abs(i - k) > min_abs {
                    // 返回 res
                    return res
                }
     
                // 令res 等于 I, 最小值min_abs, 为i与k的绝对值
                res = i
                min_abs = abs(i - k)
            }
    
            // 返回结果
            return res
        }
    

    方法.2 双指针

        func cal(_ arr:[Int], _ k:Int) -> Int {
    
            // 判断如果数在边界外直接返回对应边界值
            if arr.first! > k {
                return arr.first!
            }
            
            if arr.last! < k {
                return arr.last!
            }
            
            // 定义双指针
            var last = 0, next = 1
    
             // 遍历
            while next < arr.count {
                
                // 如果滑到, k处于两个数之间, 直接判断哪个近直接返回
                if arr[next] > k && arr[last] < k {
                    return abs(arr[last] - k) > abs(arr[next] - k) ? arr[next] : arr[last]
                }
                
                // 滑动, 指针递增
                last += 1
                next += 1 
            }
            
            return arr.last!
            
        }
    

    方法.3 二分法

        func cal(_ arr:[Int], _ k:Int) -> Int {
            
            // 判断如果数在边界外直接返回对应边界值
            if arr.first! > k {
                return arr.first!
            }
            
            if arr.last! < k {
                return arr.last!
            }
            
            // 定义last 初始下标 0, next为末尾下标 arr.count - 1
            var last = 0, next = arr.count - 1
            
            // 循环
            while next > last {
                
                // 二份
                let m = (next - last) / 2
                
                // 如果m = 0 即k在arr[last], arr[next]之间
                if m == 0 {
                     // 直接判断哪个近直接返回
                    return abs(arr[last] - k) > abs(arr[next] - k) ? arr[next] : arr[last]
                }
                
                // 如果二分数 > k, 说明 k 在last ~ m, 令  next = last + m
                // 如果二分数 < k, 说明 k 在m ~ next, 令 last = last + m
                if arr[m] > k {
                    next = last + m
                }else if arr[m] < k {
                    last = last + m
                }
                
            }
            return 0 
        }
    

    最后算法写完了, 但是没有正确运行成功。跟面试官解释了我的2种思路, 然后开始口述题。


    问题4.Runtime介绍

    runtime是一套C, C++, 汇编构成的Api。其实我们平常接触的alloc, objc_msgsend, runloop等都是runtime。因为runtime概念很大很多, 我只举例结合objc4 runtime源码给面试官管讲解了objc_msgsend流程

    底层原理可参考我之前写的:
    IOS底层(十三): 消息流程(一)快速查找
    IOS底层(十四): 消息流程(二)慢速查找
    IOS底层(十五): 消息流程(三)动态方法决议和消息转发


    问题5 App卡顿都有哪些情况导致

    因为这个问题很开放, 我也只是从CPU, GPU两个方面来分析

    • CPU(中央处理器, Central Processing Unit): 通常用于执行程序指令, 对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版

    • GPU(图形处理器, Graphics Processing Unit): 通常用于针对图像信息的渲染。

    页面卡顿原因

    正常情况下,CPU会周期性的提交要渲染的图像信息给GPU处理,保证视图的更新。一旦其中之一响应不过来,就会表现为掉帧卡顿。

    掉帧: CPU处理数据和GPU渲染时间过长导致

    解决方法

    尽量减少CPU, GPU消耗

    CPU方面

    • 尽量用轻量级的对象, 例如: 不用事件传递地方考虑使用CALayer取代UIView
    • 尽量提前计算好布局,最好不要频繁修改属性, 例如频繁地调用UIView的相关属性frame、bounds、transform等属性,减少不必要的修改
    • 图片的size最好跟UIImageView的size保持一致
    • Autolayout会比直接设置frame消耗更多的CPU资源
    • 主线程不要阻塞
    • 控制一下线程的最大并发数量, 耗时操作放在子线程执行, 例如: 文本处理, 图片处理等
    • UI控件规范使用, 例如NSTimer等

    GPU方面

    • 尽量避免离屏渲染
    • 尽量避免短时间内大量图片的显示
    • 尽量减少视图数量和层次
    • 尽量避免超大图片, GPU能处理的最大纹理尺寸是4096x4096,超过这个尺寸,就会占用CPU资源进行处理
    • UI控件规范使用, 例如tableView等

    最好也提下, 使用内置的性能工具instruments在开发中来检测性能, 耗时等问题

    问题5.1 追问Tableview卡顿哪些情况导致

    可以从这几个方法来作答

    • 重用导致, 频繁调用cellForRowAtIndexPath方法, 并在里面进行布局, 赋值等
    • 频繁cell计算高度heightForRowAtIndexPath:
    • 滑动同步加载大量图片, 或者滑动没有按需加载
    • 大量用addView给cell动态添加视图
    • 不要使用clearcolor,无背景色,透明度不设置为0
    • 正确储存Tableview数据, 减少全部刷新

    问题6.App启动优化

    也是个开放性问题, 但App启动整个流程涉及知识点就很多, 启动优化我建议从几个点举例子谈

    • dyld方面: 排查无用的dylib(动态链接器), 减少dylib数目
    • 库方面: 梳理库, 非必要库做延迟加载
    • 加载方面: load方面少做事情, 不做最好
    • 类方面: 减少启动无用的类添加, 包括不常用库, 方法, 分类, 全局变量等
    • 图片方面: 压缩资源图片,删除无用的图片
    • 算法方法: 针对启动必要算法方面, 做对应优化, 减少/避免多余计算
    • 打印方法: 减少NSLog打印

    最好还是提下, 使用instruments分析哪些比较耗时, 针对性优化下

    可能面试1小时, 时间已经快到了, 口述题只面试3~4个问题就告诉我今天面试结束了。

    第三反感

    面试3~4道开发题就结束面试, 说实话我真第一次遇见, 更不敢相信这是一个大厂面试。

    自我反思

    的确是面试时间快到了, 因为面试1个小时, 下一个时间段没准是给下一位面试者准备的。还是少一些抱怨, 多提升自己。


    总结下

    面试题目都不难, 可惜算法浪费了很多时间, 如果稳扎稳打的话, 腾讯一面是可以过的。面试反馈很快, 1天就能收到结果, 我这边结果自然是不通过。但是腾讯一面整体给我感觉不太难, 有实力的小伙伴可以试一试。

    PS:
    同时无论是面试官还是面试者都应该了解

    • 面试官: 说话做事代表的是公司形象, 尊重为首要原则

    • 面试者: 态度要摆正, 礼貌是第一位, 接着才是技术

    通过这次经验, 也给与我在未来面试以及面试别人一些警示。

    相关文章

      网友评论

          本文标题:ios面试日记 --- 腾讯一面

          本文链接:https://www.haomeiwen.com/subject/msybvltx.html