
说实话每年到了秋招季总有学弟学妹来问我“网易笔试到底考什么”而我手里真正还有印象的是2018年那套iOS开发工程师BJ笔试卷。这么多年过去技术栈在演进从OC到Swift从MVC到SwiftUI但笔试考的核心底层功底、操作系统原理、内存管理和网络底层的思路基本没有变过。包括我自己后来面试别人、出笔试题时也还是在那套题的框架上做迭代。所以我把这份卷子的考点、答题思路和避坑点结合这几年在一线做iOS开发的实操经验整理成一篇完整的复盘还在准备校招的朋友可以直接照着梳理自己的知识体系。这份笔试卷不是单纯考“会不会写代码”它更像一轮专业能力的初筛通过两个小时的选择题、简答题和一道手写代码题判断你有没有足够扎实的iOS基本功、有没有真正理解过底层机制以及遇到陌生问题时的排查思路。网易作为一个有大流量App业务线的公司对iOS开发者的要求从来不是“会调API就行”而是希望你对内存、线程、网络、渲染这些核心链路有足够深的理解。1. 写在前面这套笔试题在筛选什么样的iOS工程师1.1 从岗位JD反推考察方向2018年网易校招iOS工程师北京的岗位描述里核心关键词是这几个负责网易旗下产品iOS端功能开发、参与架构设计与性能优化、有良好的编程基础和计算机基础。这看起来是很多大厂JD的“标准话术”但结合笔试实际题目看你会发现它背后对应的是一个很具体的能力模型计算机基础 操作系统线程调度、内存管理、网络HTTP、TCP/IP、数据结构与算法。iOS开发基础 OC语言特性、Runtime、RunLoop、内存引用计数、UIKit生命周期。架构与优化 模块化思路、启动性能优化、卡顿排查、Crash分析。所以笔试里出现大量的内存管理、GCD、Runtime题目完全不是偶然。我当时刷题最大的感受是只看《Objective-C高级编程》和Apple官方文档是不够的还得把大学课本里的《操作系统》和《计算机网络》翻出来重新过一遍尤其是线程调度、死锁条件、HTTP缓存这些章节在iOS里全是高频考点。1.2 试卷结构与典型分值分配从题型上看这套卷子大致分为四个板块基础选择题20道左右、多选与概念辨析题10道左右、简答与设计题4-5道、手写代码题1-2道。整体时间150分钟题量不算大但陷阱很多。题型题量考察重点建议用时单选题约20道OC内存、Runtime、多线程、网络、UI机制30分钟多选题/判断改错约10道概念辨析、边界条件、宏与const的区别20分钟简答题4-5道RunLoop机制、事件响应链、性能优化方案40分钟架构/设计题1-2道App架构分层、模块化、组件通信方案30分钟手写代码题1-2道手写单例、链表反转、多线程同步20分钟我当时拿到卷子时第一反应是“选择题怎么这么多”但做进去之后发现比起LeetCode式的大题这些选择题反而更考验细致程度。很多考题不会直接问你“什么是循环引用”而是给你一段代码让你选出哪个闭包会导致循环引用、哪个不会。这种题目没有真跑过代码、没有真正分析过引用图光靠背概念很容易答错。2. iOS基础核心内存、Runtime与语言细节题2.1 内存管理高频考点ARC下的引用计数与循环引用网易这套笔试题里内存管理相关的题目通常占了三到四道选择题外加一道简答题的“前菜”。我记得有一道题是这样的给出一段闭包代码内部使用了self的属性和方法让判断是否会造成循环引用。这类题本质上是在考你对ARC引用图的理解而不是让你死背“block里用self要weakify”。真正清晰的解题思路是这样看self是否直接或间接持有这个block。如果self - 某个属性 - block且block - self那就构成循环。区分调用方式和赋值方式。如果只是局部变量持有block并在子线程执行执行完即释放那即使block捕获了self也不会造成永久循环引用。分析弱引用修饰符。使用__weak或weak self后block捕获的是弱引用打破环但要注意执行期间self被释放的情况必要时配合strongSelf。这套分析逻辑用在当前Swift的闭包中同样适用。Swift里[weak self]和[unowned self]的取舍也是我后来面试别人时必问的点unowned在访问已被释放对象时会直接崩溃表面省了可选绑定实际上风险很高除非你确定self生命周期和闭包一致否则优先用weak。除了闭包NSTimer也是经典考点。NSTimer会对target强引用而target往往又持有timer导致控制器无法释放。当年的标准解法是iOS 10之后的block版定时器配合weakSelf现在项目里我一般直接用Timer的block API并在deinit里做invalidate同时加入RunLoopmode的兜底处理避免滑动时定时器暂停。2.2 Runtime机制与消息传递不仅背方法名还要画出流程图Runtime题目在当年卷子里几乎算“必考”。选择题常考的有objc_msgSend的消息查找流程、isa指针的作用、method swizzling的实现原理、KVO底层是怎么实现的。这些题目如果只是背结论遇到稍微变形的题就会露馅。我当时复习时画过一条链路这里也分享给准备笔试的朋友调用一个OC方法例如[obj doSomething]编译器会把它转成objc_msgSend(obj, selector(doSomething))。objc_msgSend会根据对象的isa找到类对象在类对象的method_list里查找对应SEL。查不到就沿着superclass指针逐级往上找直到NSObject。还没找到就进入动态方法解析resolveInstanceMethod:。动态解析没处理再走快速转发forwardingTargetForSelector:。最后走完整的消息转发methodSignatureForSelector:forwardInvocation:。这套流程你必须能完整写出来而不是只记住“消息转发”四个字。网易的简答题就有一道是“简述消息转发机制并给出至少一个实际应用场景”我把Runtime在防崩溃处理上的使用比如对找不到的方法做消息转发并打日志写上去和普通的“用Method Swizzling交换方法”相比得分明显更稳。关于KVO我建议复习时多问自己一层KVO真正修改的是哪个对象答案不是当前对象本身而是runtime动态生成一个子类NSKVONotifying_类名把实例的isa指向这个新类然后重写属性的setter方法在setter里调用willChangeValueForKey和didChangeValueForKey。明白这一点之后你才能理解为什么KVO要求属性是通过KVC兼容方式访问的以及为什么重写class方法可以“骗过”外界。2.3 OC与Swift对比题从值类型到引用语义2018年笔试卷里已经开始零星出现Swift题目比如“Swift中class和struct的区别”、“值类型和引用类型的存储位置”。到了现在Swift占比更高但核心差异其实还是那一套class是引用类型存储在堆上赋值传递引用struct是值类型栈上存储赋值是拷贝。struct天然避免循环引用适合做模型层class适合做需要共享可变状态的UI控制器。Swift的String、Array、Dictionary虽然是值类型但底层有copy-on-write优化真正发生写入时才深拷贝这一点是面试官喜欢追问的细节。我还记得卷子里有一道多选问“哪些类型适合用struct”选项里有坐标点、数据库模型、网络请求参数、视图控制器。正确答案是坐标点和网络请求参数因为它们是值语义不期望被共享修改而数据库模型在复杂业务中往往需要被多处持有并修改用class更顺手。这种题看起来简单但容易在“数据库模型”上纠结我的经验是判断标准永远是“这个对象是否应该被唯一持有还是多处共享可变”。3. 并发与网络大厂笔试里的重头戏3.1 多线程方案对比与GCD死锁排查多线程是网易笔试的绝对高频板块。选择题一般会考GCD的队列类型串行/并行、同步/异步、dispatch_async与dispatch_sync的不同组合、信号量、栅栏函数以及死锁场景判断。简答题则有可能让你写出“在子线程执行耗时操作后回调主线程更新UI”的几种写法。死锁是我觉得这道题里最值得展开讲的。经典题目是在主队列上执行以下代码会发生什么- (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_main_queue(), ^{ NSLog(block execute); }); }答案是死锁。原因很简单主线程正在执行viewDidLoaddispatch_sync把block派发到主队列但主队列是串行队列当前任务没有执行完后续任务不可能被取出执行于是同步等待就永远等不到结果。哪怕block内容只有一行log也一样死锁。理解了原理后面对变种题比如先dispatch_async到主队列再在里面dispatch_sync到主队列就能推出来async不会死锁但sync一定死锁。所以我的复习建议是不要背“主队列不能用sync”这种结论而是画队列和线程的示意图理解阻塞条件。另一个容易考的是dispatch_semaphore。信号量本质是一个计数器signal加一、wait减一减到负数时阻塞。它常用于控制并发数、同步多个异步任务。实际项目里我常用它来把多个网络请求合并成一个最终回调比如同时请求用户信息和配置信息两个都回来后统一刷新UI这种写法在笔试题里也出现过。要注意的是信号量等待会阻塞线程如果放在主线程上会导致卡顿和App被杀线上环境必须避免。3.2 网络层考点HTTP缓存、HTTPS握手与请求转发网络部分网易笔试重点在HTTP协议、DNS解析、HTTPS通信过程、TCP三次握手和四次挥手偶尔还会穿插一两个“如果后端返回500你会怎么排查”的开放题。这些内容虽然教材上都有但结合iOS场景后考察的角度很不一样。比如HTTP缓存这一块考题会问你Cache-Control和Expires的区别是什么ETag和Last-Modified分别在什么时候起作用iOS的NSURLSession默认缓存策略对GET请求怎么处理我当时的答法是Expires是绝对时间服务器和客户端时间不一致时容易出问题Cache-Control: max-age是相对时间更可靠。缓存过期后要重新向服务器确认ETag通过If-None-Match发回服务器判断资源没变就回304让客户端用本地缓存。Last-Modified配合If-Modified-Since也可以做条件请求但精度到秒如果文件在秒级内修改过可能误判。在iOS开发里NSURLSession默认情况下对已缓存响应会有一定命中逻辑但实际业务中我们通常通过URLCache或者网络层框架如今日头条开源的Cronet、老牌的AFNetworking/NSURLSession封装做更精细的缓存控制。笔试时即使不问框架也能把“服务器返回Cache-Control头 客户端URLCache策略”这条链路讲清楚这能让阅卷人觉得你不是只会调AFNetworking。HTTPS握手这块2018年考得比较基础三次握手、TLS握手流程、证书校验、AES与RSA的混合加密以及中间人攻击的原理。核心答法是客户端发起ClientHello携带支持的加密套件和随机数。服务器返回ServerHello、证书和随机数。客户端验证证书链可信取出服务器公钥。客户端生成预主密钥用服务器公钥加密后发给服务器RSA密钥交换模式或做ECDHE秘钥协商。双方基于预主密钥生成对称会话密钥后续用AES等对称加密通信。当时有一道选择题问“HTTPS为什么不用纯RSA加密通信”答案是RSA性能低且公钥加密有长度限制。实际项目里还能补充一点RSA只能加密少量数据大数据量用对称加密更高效所以TLS采用“非对称协商密钥 对称加密数据”的混合方案。这道题我记得很清楚因为之前我只知道“HTTPS更安全”但从没想过效率问题是在刷题时才补上的。3.3 数据持久化与技术选型分析网易笔试还考过数据存储方案的选型NSUserDefaults、plist、SQLite、Core Data、Keychain分别适合什么场景。这个题目看起来是送分题但延伸出去就有很多细节NSUserDefaults适合存小体量的偏好设置不适合存大数据且它会在启动时被加载到内存里存太多会影响启动速度。plist适合存结构简单的配置读写方便但并发写存在风险。SQLite适合结构化数据和大量查询iOS底层很多框架的存储都基于它。Core Data是对象关系映射框架底层可以用SQLite存储但学习曲线陡峭使用不当容易造成内存峰值。Keychain用来保存敏感信息如登录token、密码因为数据是加密存储的且卸载重装后仍可能保留。我当时答这道题时还补充了一点在IM类App或内容型App里大量消息列表、草稿箱数据都走SQLite 数据库迁移而业务配置、开关量才走NSUserDefaults登录凭证一律走Keychain并配合access group实现同账号多端共享。这种“从业务场景反推存储方案”的思路正好是校招笔试愿意看到的工程化思维。4. 系统机制与iOS架构设计题4.1 RunLoop与UI生命周期别再只答“保证线程不退出”RunLoop题目在网易笔试里出现过至少两次。选择题考的是RunLoop的几种mode、NSRunLoopCommonModes、NSTimer在滚动时失效的原因简答题则有可能让你“简述RunLoop和AutoreleasePool的关系”。RunLoop最核心的作用我习惯用一个比喻解释它就像一个大堂服务生线程没事做时让它休息来了事件就处理一下处理完继续休息从而让线程常驻又不占用CPU。主线程的RunLoop默认开启所以App能一直响应触摸、定时器、网络回调等事件。关于mode你必须理解RunLoop在同一时刻只能运行在一种mode下。默认是kCFRunLoopDefaultMode滚动时会切换到UITrackingRunLoopMode。如果NSTimer是在默认模式下添加的滚动时模式切换timer就不被调度于是出现“拖动时定时器暂停”的现象。解决方案是把它加入NSRunLoopCommonModesCommonModes不是一种真正存在的mode而是一个“可切换mode集合”加入之后会在滚动和默认模式下都能被调度。AutoreleasePool和RunLoop的关系笔试爱考的是这样一个事实App启动后主线程RunLoop会在每个事件循环开始时自动创建autoreleasepool在结束时drain掉。也就是说主线程中晚些时候对象并不会等到内存紧张才释放而是在当前RunLoop周期结束时自动释放。这也是为什么在一个大循环里创建大量临时对象即使有autoreleasepool包裹也可能因为整个循环处于同一个RunLoop周期而累积内存峰值最好手动加autoreleasepool及时释放。4.2 事件响应链与UIScrollView嵌套的经典解答题事件传递是UIKit面试和笔试里绕不开的坎。网易出过这么一道简答题点击屏幕上某个View系统是如何找到这个View并让事件被它响应的。这道题考察两个方向hitTest和响应链。当手指点击屏幕时系统先通过hitTest:withEvent:从UIWindow的根视图开始把触摸点转换成子视图坐标系先倒序遍历子视图找到最合适的一个返回最底层——也就是最上层的那个能响应的子视图。如果子视图返回nil就继续查兄弟视图如果所有子视图都不响应就返回自身。整套查找是从父到子再从子回到父的递归过程。事件找到之后如果这个视图没有处理touchesBegan等方法事件会沿着nextResponder链向上传递直到某个对象处理或到AppDelegate结束。笔试里常考的变种是为什么按钮放在一个userInteractionEnabledNO的父视图上按钮点了没反应为什么半透明区域也能响应点击是因为alpha0.01时系统会跳过但透明不等于不响应。补充一个实际开发里经常遇到的坑UIScrollView嵌套时响应链和手势冲突会叠加出很多诡异问题。我当时笔试前刚好做过一个“外层TableView 内层横向滚动视图”的需求所以答这类题时有实际例子可以写。给备考同学的建议是一定要亲自动手写一个嵌套滚动Demo把gestureRecognizerShouldBegin、shouldRecognizeSimultaneouslyWithGestureRecognizer这些手势代理的关系理清楚笔试遇到“手势冲突如何解决”就有话讲了。4.3 架构设计题MVC、MVVM和组件化的取舍网易当年的简答题里有一道让我印象很深在开发一个大型App时如何划分模块你倾向于MVC还是MVVM为什么这题没有标准答案但阅卷人要看的是你对架构演进的理解而不只是名词解释。我的答法是把“小项目用MVC、中大型项目用MVVM、多人协作引入组件化”这个演进路径描述出来然后落到网易的业务场景页面简单、交互不复杂时MVC够用Controller虽然会膨胀但边界清晰。页面逻辑复杂、状态多时引入MVVM用ViewModel持有展示数据和业务状态控制器只做视图绑定和路由让单元测试可以直接打在ViewModel上。多个业务团队并行开发时底层抽成基础组件网络层、日志、存储、路由业务按模块拆成独立组件通过协议或路由中间层通信避免模块间互相依赖头文件。架构题是笔试中区分度最高的题目之一。多数人只会写“MVC不好、MVVM好”但真正有工程经验的人会分析“为什么Controller会膨胀”“RxSwift的绑定时机怎么处理”“组件化会不会带来依赖地狱”。我在答这道题时特别强调了“组件化要配合代码隔离和架构图评审否则拆了等于白拆”这个细节后来在和网易面试官讨论时得到了认同。5. 性能优化与实战排查题5.1 启动优化从dyld到首帧的每一步网易笔试有一道简答题大概是App启动时间过长你会从哪些方面优化。这个题目从现在看依然是各厂性能优化的核心话题可以说考察的是对iOS启动全链路是否了解。启动流程大致分几个阶段内核加载App可执行文件创建进程。dyld动态链接器加载所有依赖的动态库做rebase和bind。执行所有load方法、C静态初始化、Swift的自动初始化。main()执行然后进入UIApplicationMain。didFinishLaunching执行创建根视图控制器渲染第一帧。每个阶段都有对应的优化手段。减少动态库数量、合并已有库、删除不需要的类和方法能缩短dyld阶段把load里的逻辑挪到initialize或首帧渲染后能减少启动时CPU占用didFinishLaunching里的初始化尽量懒加载像日志、配置读取放到子线程避免阻塞首帧渲染。如果你是校招生可能没有线上大型项目给你练手但你可以做一个启动时间统计的Demo用CFAbsoluteTimeGetCurrent或DispatchTime打点记录每个关键节点耗时做成一个简单的热启动/冷启动对比工具。这个做法写在笔试答案里会显得你既有思路又有落地能力。5.2 卡顿检测与内存泄漏排查卡顿问题在网易笔试题里的出现形式一般是“页面滚动不流畅如何定位原因”。这题考察的是你对主线程承担任务的理解主线程要处理UI布局、渲染、点击事件、部分数据计算一旦耗时超过16.7ms一帧时间就会丢帧卡顿。排查方法用Instruments的Time Profiler看主线程耗时栈、用Core Animation查看离屏渲染、用系统诊断日志看主线程卡顿或者自研一个基于CADisplayLink的卡顿检测工具——连续两帧间隔超过阈值就上报。内存泄漏这块除了前面说的循环引用值得提的是deinit是否执行、Leaks是否增长、Memory Graph里对象是否被意外持有。网易这道题我答的关键词是“先看栈再看引用图最后做重复操作稳定复现”突出的是一个工程排查流程而不是单点知识。5.3 Crash分析与日志分析题有一类开放题是给你一个线上Crash日志让你分析可能的原因。这类题在笔试里不一定给你完整日志但会问“线上Crash之后你会怎么排查”。比较可靠的答题结构拿到崩溃日志看异常类型EXC_BAD_ACCESS、SIGABRT、NSInternalInconsistencyException。看崩溃线程调用栈定位到具体的方法和代码行。看UIApplication的lastException信息或自定义日志breadcrumbs往前追溯可能导致崩溃的操作序列。尝试在测试环境复现条件包括内存、网络、用户操作路径。修复后通过Crash平台对比同一类型Crash的发生率是否下降。Crash处理常常被校招生忽略但网易面试官很吃这一套。当年我在笔试里写到自己做过“野指针Crash分析”的小工具虽然只是个雏形但至少展示了我是带着工程思维去学习的。6. 编程题与算法细节稳定拿分的策略6.1 常见手写代码题类方法、单例、链表与多线程同步网易笔试题的手写代码部分一般不是LeetCode上的难题而是考察“你会不会用正确的语言姿势写出可靠代码”。我遇到的题目包括手写一个安全的单例、手写一个线程安全的数组读写、反转一个单链表并分析复杂度以及用GCD实现一个一次性事件。单例题最容易踩坑。校招生常见的写法是提供一个sharedInstance类方法返回一个静态实例但没有考虑线程安全。笔试时推荐写这种implementation MyManager (instancetype)sharedInstance { static MyManager *instance nil; static dispatch_once_t onceToken; dispatch_once(onceToken, ^{ instance [[MyManager alloc] init]; }); return instance; } enddispatch_once保证整个进程生命周期内block只执行一次而且线程安全这是苹果推荐的写法。我在答题时还会补一句如果单例对象在销毁后需要重建这种写法就不可用了需要改成带锁的懒加载但大部分App场景用dispatch_once就够了。链表反转这种题就是纯数据结构题虽然网上答案很多但笔试时要手写出来还是有很多人会搞混指针。建议在纸上画三指针法prev、current、next的每一步确保边界条件空链表、单节点链表都cover到。代码大概是这样func reverseList(_ head: ListNode?) - ListNode? { var prev: ListNode? nil var curr head while curr ! nil { let next curr?.next curr?.next prev prev curr curr next } return prev }如果笔试语言可选我建议用Swift写这种算法题语法简洁不容易因为OC的nil语义出错。6.2 多线程安全代码题如何优雅地读写共享数据另一道让我印象深刻的题是多线程环境下面向一个可变数组做读和写如何保证安全。基础答法是加锁但怎么加锁有讲究synchronized简单易用但性能较差且锁粒度是整个代码块。NSLock比synchronized轻量但需要手动lock/unlock容易忘解锁。dispatch_semaphore可以做更细粒度的控制申请信号量再操作操作完释放。更推荐的是用并发队列加栅栏块读用dispatch_sync并行执行写用dispatch_barrier_async保证在写之前所有读完成、写之后才继续其他操作。- (id)objectAtIndex:(NSUInteger)index { __block id obj nil; dispatch_sync(_concurrentQueue, ^{ obj [_array objectAtIndex:index]; }); return obj; } - (void)addObject:(id)obj { dispatch_barrier_async(_concurrentQueue, ^{ [_array addObject:obj]; }); }这种“多读单写”的模式生产环境里很实用笔试时写出来也能体现出你对并发控制的真实理解而不是只会背synchronized。7. 笔试答题策略与复盘经验7.1 时间分配与答题顺序150分钟我的分配建议是前30分钟做选择题遇到没把握的先标记不要在单题上死磕。中间60分钟做简答题和设计题把能写的步骤、流程图、伪代码都写清楚判卷人哪怕你没答完整也能看到你的思路。最后30-40分钟做编程题先想边界条件再动笔写完再用实际例子在脑子里跑一遍。剩10分钟检查选择题把标记的题目重新过一遍。“先做后面的大题”是我从网易笔试里学到的教训。因为编程题分值高如果放在最后只留下10分钟就算你懂解法也来不及写而前面的选择题多错两三道就算后面大题全对总分还是会被拖下去。7.2 我踩过的坑过度堆名词、忽略边界条件复盘这套笔试卷我自己踩过两个很有代表性的坑。第一个坑是在一道“是否造成循环引用”的选择题里因为过度关注__weak修饰而忽略了block是否被立即执行。实际上如果block是被当作参数传给系统API并立即执行没有变量长期持有它那么即使捕获了self也不会形成循环。我当时只记住了“block要weak”结果选错。第二个坑是算法题的边界条件。手写链表反转时我只写了主循环没有处理空链表也没有判断是否只有一个节点。虽然核心逻辑是对的但阅卷人一看边界没考虑就会认为你对数据结构的理解停留在“背模板”级别扣分很狠。7.3 笔试之后到面试的衔接怎么把“卷面知识”转化为“表达能力”拿到笔试通过的通知后节奏一般是几天之内安排面试。这个阶段我强烈建议做三件事把所有笔试时没答好的题目重新梳理一遍理解原理之后再自己讲一遍最好能对着镜子或录音讲出来。准备2-3个高质量项目经历重点描述“你负责了什么、踩了什么坑、怎么排查、最终效果是什么”一定要有数据支撑比如崩溃率从2%降到0.3%、启动时间提升30%。复习iOS系统框架的底层机制尤其是RunLoop、消息转发、事件响应链因为面试官常会顺着笔试的简答题往下深挖。网易笔试之后的那轮面试我被问到的很多问题都是从笔试卷子引申出来的比如“你写KVO会崩溃吗怎么防护”“RunLoop在滚动时为什么Timer会不更新”。所以笔试不是为了答题而是为面试铺路每一道题都要当成面试追问的起点去准备。8. 结语做网易2018这套iOS校招笔试卷已经过去好几年了但我每次带新人、出题或者帮学弟学妹做模拟面试都会把当年的考点拿出来翻一翻。它让我形成了一个很基础的判断大厂iOS校招要求的技术栈并不花哨考察的是内存管理、并发模型、网络请求链路、UIKit机制、性能优化以及最基础的数据结构能力。这些内容在任何一次iOS版本迭代里都依然有效——SwiftUI也好Metal也好底层逻辑还是那几块。我也知道不少人吐槽这类笔试题“太底层、平时用不到”。但以一个过来的iOS开发者的视角看底层能力决定了你遇到线上诡异Bug时是一筹莫展还是能一步步从堆栈和日志里找到根因。如果你还在准备校招笔试我的建议是把这份卷子里的每个考点自己动手写一个Demo验证一遍然后用自己的话把原理讲出来。这个过程比刷十套模拟题都管用。最后分享一个我在实际笔试时的小技巧拿到卷子先把所有题目浏览一遍把印象中最难的标记出来答题时先做有把握的把分值先稳住再回头啃难题。当时我就是靠这个策略在选择题上拿到了比较稳定的分数后面的大题真正让我拉开差距的是每一道题都写满了“分析过程”和“可能的优化方向”这两点比标准答案更让阅卷人觉得你是可培养的人。祝顺利。