远景智能秋招软件技术笔试题复盘:考点逻辑与答题策略

远景智能秋招软件技术笔试题复盘:考点逻辑与答题策略 笔试这事儿说实话拿到邮件的时候才是最紧张的。远景智能2023秋季招聘软件技术笔试题第一批当时我在牛客上翻了不少往年的经验帖又把手边的Java、网络、数据库资料重新过了一遍才敢点开在线笔试链接。整套题做下来我的第一反应是它没有刻意出偏题怪题但考察面非常宽而且特别看重基础功底的深度。如果你正在准备软件技术方向的校招笔试这篇复盘我把整批题的考点逻辑、答题策略和我踩过的坑都梳理了一遍希望能帮你少走点弯路。1. 笔试链接点开后我先把这场考试的目标猜了个七七八八1.1 为什么软件技术岗的笔试一上来就是基础的地毯式轰炸远景智能做的是智能物联操作系统和能源数字化平台软件技术岗面对的业务场景往往带有典型的物联网特征海量设备接入、高并发数据上报、时序数据存储、规则引擎处理。这意味着岗位要求候选人不光会写业务代码还得懂并发、懂网络、懂存储否则很难处理真实环境里“百万台设备同时上报”这类问题。所以这套笔试的方向很明确先把候选人的语言基础、数据结构和算法、计算机网络、操作系统、数据库这些基本功过一遍再通过编程题看代码落地能力最后用少量开放题考察工程思维。说穿了就是想在最短的时间内筛出那些“能上手干活”的人而不是只会背框架的选手。1.2 我按题型和时间给自己列的第一版计划在线笔试一般会给一个总时长常见配置是选择题、填空题、编程题和少量简答题混合排布。针对这种情况我给自己定的时间是选择填空不要恋战一道题最多花一到两分钟不会的先标记跳过编程题尽量留足一半的时间因为运行测试用例和修Bug远比想象中更耗时间。我按可能会出现的考察方向整理了一张清单用来对照自己的复习状态考察模块核心内容优先级语言基础Java集合、并发、JVM高数据结构与算法数组、链表、栈、队列、二叉树、动态规划高计算机网络TCP/IP、HTTP、网络模型中高操作系统进程线程、死锁、Linux命令中高数据库SQL编写、索引、事务高系统设计接口设计、缓存、消息队列中这张表未必和每一份真实试卷完全一致但对软件技术方向的校招笔试来说覆盖面的逻辑是通用的。把这里面的每个格子填满答题时心里就稳了一大半。2. 语言基础题Java集合、并发和JVM里那些“肯定会遇到”的坑2.1 HashMap被反复问不是因为它简单我敢说十份软件技术笔试里有八份会考HashMap远景智能这批大概率也绕不开。为什么大家这么喜欢考它因为HashMap能同时带出哈希函数、数据结构、扩容机制、线程安全问题一道题能串起半本Java基础。笔试里最常出现的问法是HashMap的底层结构是什么put一个键值对时到底发生了什么。我的回答习惯是分三层讲第一默认初始化容量是16负载因子是0.75当元素数量超过容量乘负载因子时就会触发扩容新容量是原来的两倍第二桶里一开始是链表当链表长度超过8且数组长度达到64时会转成红黑树树化是为了防止极端哈希冲突下查询退化成O(n)第三HashMap不是线程安全的并发场景下多线程put可能造成数据覆盖甚至JDK 7时期扩容时可能出现环形链表导致get死循环JDK 8虽然改了插入方式避免了死循环但线程安全问题依然存在。还有一个高频衍生题为什么重写equals的时候一定要重写hashCode。这个要从哈希表的查找逻辑去理解HashMap先算hash定位桶再在桶里用equals比较对象。如果两个对象equals相等但hashCode不同它们会被分到不同桶里get时就找不到反过来hashCode相同但equals不等只会造成哈希冲突不影响正确性。所以equals相等的对象hashCode必须一致。2.2 并发题的考点从synchronized到线程池参数软件技术岗笔试里的并发题通常不会让你手写太复杂的并发容器更多是考察基础概念的理解。比如synchronized和volatile的区别volatile保证可见性和有序性但不保证原子性synchronized则同时保证三者。再比如CAS是什么底层用到了处理器提供的比较并交换指令但存在ABA问题和自旋开销实际开发中可以用AtomicStampedReference解决版本号问题。线程池是另一个几乎必考的考点尤其是那七个构造参数。我习惯用“一个任务进来之后会发生什么”来串联理解先判断核心线程数是否已满没满就创建线程执行满了就放入工作队列队列也满了就看最大线程数是否已满没满就创建临时线程还是满了就走拒绝策略。回答时最好能把参数和生命周期对应上会显得你真的理解过。线程池参数作用容易踩的坑corePoolSize核心线程数核心线程也会被回收取决于allowCoreThreadTimeOutmaximumPoolSize最大线程数必须大于等于corePoolSizeworkQueue任务队列有界队列和无界队列差别很大keepAliveTime非核心线程空闲存活时间核心线程默认不受影响threadFactory线程工厂记得给线程命名方便排查问题handler拒绝策略默认AbortPolicy直接抛异常2.3 JVM与内存选择题里的拦路虎如果说HashMap还能靠记忆应付JVM的题就真得理解了。常见的选择题会问哪些变量存放在堆上哪些在栈上哪些在方法区或元空间。基本规则是对象实例和数组在堆上局部变量和引用在虚拟机栈上类元信息在方法区JDK 8以后是元空间字符串常量池在堆里。遇到“String s new String(abc)创建了几个对象”这种题要看字面量是否已存在于常量池如果不存在就是两个对象一个是常量池里的字面量对象一个是堆上的String对象。GC相关的题也容易考。比如怎么判断对象可以回收主流答案是可达性分析从GC Roots出发遍历不到的引用对象就可以回收。GC Roots包括虚拟机栈中引用的对象、静态属性引用的对象、常量引用的对象、本地方法栈中JNI引用的对象。再往下可能会问强引用、软引用、弱引用、虚引用的区别软引用适合做缓存弱引用适合做ThreadLocal之类的场景。2.4 关于复习语言基础的一点私人体会如果你不是Java方向而是用C或Go答题核心知识点是相通的C会考智能指针、虚函数和多态Go会考goroutine和channel。但不管什么语言我建议把集合和并发作为优先级最高的两个模块。因为编程题能用到的语言特性反而不多而选择填空里真正拉开差距的基本都集中在这两块。3. 编程题阶段能过用例和不能过用例的人差在哪儿3.1 编程题并不是只考难算法提到校招笔试很多人第一反应是LeetCode刷题但实际做下来会发现软件技术岗的编程题往往更偏“模拟题”和“经典题”比如字符串处理、数组排序、链表操作、二叉树的遍历偶尔才会有动态规划。难点通常不是算法本身而是在有限时间内写出没有Bug的代码。我复盘时的结论是编程题的得分率很大程度上取决于你熟悉多少种“套路模板”。链表反转、快慢指针找环、双指针去重、滑动窗口、单调栈、DFS回溯、BFS最短路、排序、二分查找这些是出现频率最高的骨架。把这些骨架条件反射式地记住考试时才有余力去处理特殊情况。3.2 两个高频题型的拆解示范以“最长无重复字符的子串”为例这类题在笔试中经常出现最优解是滑动窗口。核心思路是用左右两个指针维护一个窗口右指针不断右移遇到重复字符时左指针跳到重复字符的下一个位置同时用一个Map或数组记录字符最近出现的位置。public int lengthOfLongestSubstring(String s) { MapCharacter, Integer pos new HashMap(); int maxLen 0; int left 0; for (int right 0; right s.length(); right) { char c s.charAt(right); if (pos.containsKey(c) pos.get(c) left) { left pos.get(c) 1; } pos.put(c, right); maxLen Math.max(maxLen, right - left 1); } return maxLen; }再举一个“TopK高频元素”的例子。这个题既可以用堆来做也可以基于快排思想做partition。笔试时我会优先用小顶堆因为代码更不容易写错时间也足够。先把所有元素和出现次数统计到Map里再维护一个大小为k的小顶堆堆顶就是当前第k大的频率最后把堆里的元素取出来。3.3 边界条件与在线笔试提交技巧很多时候编程题跑不过用例不是算法错而是边界条件没处理好。我给自己的检查清单是输入为空或长度为0时能不能直接返回数组只有一个元素时能不能跑通数值运算会不会超出int范围需不需要用long字符串里有没有空格、大小写、特殊字符链表有没有环数组下标会不会越界还有一点是很多同学忽略的在线笔试平台对输入输出的读取方式有差异。有的平台用标准输入有的已经封装好了函数参数。如果依赖IDE自动补全切到笔试页面时容易手忙脚乱。我建议提前在牛客或者目标企业指定的平台熟悉一下环境至少要知道怎么自己读一行输入、怎么解析逗号分隔的数组。3.4 调试的时间预算怎么控制我的切身体会是编程题最大的时间黑洞不是想思路而是调Bug。笔试环境往往没有IDE那么好用的断点调试最多只能逐行打印。所以我给自己定了一条纪律每道编程题最多留10到15分钟写核心逻辑如果超过20分钟还没跑通第一个用例就先放弃去做后面的题最后再回头补。另外写完代码后一定要在本地或者文本编辑器里重新审视一遍尤其是循环边界、递归终止条件这些地方。很多时候线上Run一次的结果能在你的代码里看到一些明显问题但笔试时间紧张最好在第一次提交前就做一轮“人肉模拟执行”。4. 网络、操作系统和数据库几乎每题都有可复现的结论4.1 计算机网络三道高频题背后的共同逻辑网络部分的题虽然变化多但核心就那几个。TCP三次握手为什么是三次而不是两次因为要确保双方的收发能力都正常。四次挥手时主动关闭方为什么要等待TIME_WAIT因为要保证最后一个ACK能到达对方万一丢了可以让对方重发FIN同时防止旧连接的数据包残留在网络中干扰新连接。TCP拥塞控制也常考慢启动、拥塞避免、快重传、快恢复这四个阶段要能讲清楚。具体来说慢启动是指cwnd指数增长到达慢启动阈值后进入拥塞避免阶段线性增长一旦出现超时重传或丢包会触发拥塞窗口缩小快速恢复机制会根据策略调整阈值和窗口。笔试如果出到这道题加分项是画出现状变化曲线口头描述时要突出“越接近网络瓶颈增长越保守”。HTTP状态码也要过一遍2xx表示成功301是永久重定向302是临时重定向304表示协商缓存生效400是客户端请求错误401是未认证403是禁止访问404是资源不存在500是服务器内部错误502是网关错误503是服务不可用。如果题目问HTTPS重点说清楚非对称加密协商密钥、对称加密传输数据的组合逻辑。4.2 操作系统进程线程、死锁、IO模型操作系统部分最常出现的选择题是进程和线程的区别、死锁条件、虚拟内存和IO模型。死锁的四个必要条件要背到条件反射互斥、持有并等待、不可剥夺、循环等待。解决思路就是破坏其中一个条件比如用资源有序分配法破坏循环等待用超时释放破坏持有并等待。IO模型也是物联网平台相关岗位的高频考点因为大量设备连接本质上就是网络IO。先把阻塞IO、非阻塞IO、IO多路复用、异步IO的区别搞清楚再专门记忆select、poll、epoll的区别。一句话版本是select有1024个文件描述符上限poll用链表解决上限问题但仍是轮询epoll通过事件驱动机制只处理活跃连接更适合高并发场景。4.3 数据库笔试从SQL编写到索引失效场景数据库是软件技术岗笔试里最“实战”的部分因为它直接反映你有没有写过真实业务代码。SQL题一般会给你几张表让你写查询。比如一张设备表和一张设备指标表需要统计某种设备最近24小时的平均指标。这种题需要把GROUP BY和HAVING用熟同时注意时间的过滤条件最好在JOIN之前做这样能减少参与JOIN的数据量。索引部分更爱考失效场景而且往往以“以下哪种情况不会走索引”这种选择题出现。常见的坑包括在索引列上使用函数或运算比如WHERE YEAR(create_time) 2023违反最左前缀原则隐式类型转换LIKE %关键词以通配符开头用OR连接的条件中只要有一个列没有索引就可能导致全表扫描。4.4 我的做法把知识点变成一张“查错表”我的复习习惯是给高频考点建立一张“问题-答案-出错点”对照表就像程序员排查Bug一样。比如“TCP为什么需要三次握手”对应的出错点是答成“为了确认双方身份”“HashMap默认容量”的出错点是答成“16还是64扩容阈值记混”。考前翻一遍这张表比重新看一遍大部头教材效率高得多。5. SQL和设计题一看就知道你有没有干过活5.1 用一道四表联查把SQL基础吃透如果想在SQL题上拿全分我建议把“多表联查”练出一种肌肉记忆。考试时你可能会看到这样的表结构用户表、订单表、商品表、订单明细表。查询目标可能是“统计每个用户购买的商品总金额只显示金额大于1000的用户”。SELECT u.user_name, SUM(od.amount * od.price) AS total_amount FROM user u JOIN orders o ON u.user_id o.user_id JOIN order_detail od ON o.order_id od.order_id GROUP BY u.user_id, u.user_name HAVING total_amount 1000 ORDER BY total_amount DESC;这种题考查的不只是SQL语法还有对业务的理解。HAVING是在分组之后过滤WHERE是在分组之前过滤这两者一旦用错结果就失真。还有一点GROUP BY的字段在部分数据库里要求必须出现在SELECT列中虽然MySQL放宽了限制但规范写法还是要遵守。5.2 索引与事务隔离级别笔试里常见的“设计感”考法除了SQL编写笔试还会通过选择题或者简答题考事务隔离级别。MySQL的默认级别是REPEATABLE READ通过MVCC实现。四种隔离级别分别解决脏读、不可重复读、幻读问题但REPEATABLE READ在部分场景下仍可能幻读想彻底解决需要加锁或使用SERIALIZABLE。答这道题时最好能说清楚“读已提交”解决脏读但不解决不可重复读以及“可重复读”解决不可重复读但可能幻读逻辑链条就完整了。索引设计题也可能出现比如给你一张记录设备上报数据的表里面有设备ID、时间戳、设备状态等字段问怎么建索引。给出一个拆分维度查询主要是“某个设备在某段时间的数据”所以联合索引建议是(device_id, ts)设备ID放左侧时间戳放右侧这也符合最左前缀原则。同时要注意如果表是时序数据表冷热数据要分区存储不能只靠索引解决问题。5.3 简单系统设计题不追求完整方案追求思考路径少数笔试会有一道开放性的小型设计题比如设计一个短链接服务、设计一个设备数据上报接口、设计一个LRU缓存。遇见这种题不用慌按需求分析、接口设计、存储设计、性能与容错四个维度依次展开就能拿到不错的分数。以“设备数据上报接口”为例我的回答结构是先明确数据字段包括设备ID、时间戳、业务数据上报方式用HTTP POST或MQTT再考虑幂等性用设备ID加时间戳生成唯一请求ID服务端通过Redis去重然后考虑削峰上报消息先写入消息队列再由消费者批量写入时序数据库最后说监控和告警如果某个设备上报量突增要能自动触发限流或隔离。这个小框架不一定能覆盖所有细节但比只丢出一个接口写法要显得完整得多。6. 从第一批笔试复盘里我提炼出了自己的备考清单6.1 三层递进的备考计划如果时间充裕我建议把整个备考过程拆成三个层次。第一层是打基础用两周到三周把Java集合、并发、JVM、计算机网络、操作系统、SQL的核心知识点过一遍每块知识都要能用自己的话向别人讲清楚。第二层是刷题每天固定做三到五道算法题优先覆盖高频题型同时把SQL的经典练习题做熟。第三层是模拟找两到三个傍晚完整做一套模拟卷严格按照考试时间执行。时间紧的话至少要保证第二层和第三层因为笔试最终是看你能不能在屏幕上写出正确代码。知识点可以靠突击但手感和节奏感很难临时练出来。6.2 刷题之外的“考场工程”细节在线笔试不只是考验脑力也考验设备和环境。提前一天检查摄像头是否能用浏览器版本是不是被考试平台支持网络是否稳定。我见过有同学因为浏览器弹窗拦截或者输入法切英文不及时白白浪费了五分钟。这些看起来不起眼的小细节在分秒必争的考试里都会被放大。还有一个容易被忽略的点是在线笔试页面和外接显示器分辨率不匹配导致的排版问题。部分平台在缩放比例不是100%时代码编辑区显示异常甚至代码会串行。考试开始前先把页面缩放调到100%切到英文输入法把一切可能影响敲代码的因素提前排掉。6.3 复盘时最值得问自己的三个问题每做完一套模拟卷或者正式笔试后我会问自己三个问题第一选择题里哪些是蒙对的哪些是真正会的蒙对的知识点是不是有漏洞第二编程题里有没有“思路正确但没时间写完整”的题如果有是时间分配问题还是代码熟练度问题第三SQL和设计题的答题过程里有没有犯低级错误比如字段名写错、连接条件漏了把这三个问题的答案记录下来下次复习就有了明确方向。校招笔试一轮接一轮很难有人每套试卷都做到完美但每次比上一次多涨几个经验点后面的机会就会越来越大。