☰
远景智能秋招软件技术笔试题复盘:考点逻辑与答题策略
2026/10/12 6:32:57 网站建设 项目流程

笔试这事儿,说实话,拿到邮件的时候才是最紧张的。远景智能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核心线程数核心线程也会被回收,取决于allowCoreThreadTimeOut
maximumPoolSize最大线程数必须大于等于corePoolSize
workQueue任务队列有界队列和无界队列差别很大
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) { Map<Character, 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和设计题的答题过程里,有没有犯低级错误,比如字段名写错、连接条件漏了?

把这三个问题的答案记录下来,下次复习就有了明确方向。校招笔试一轮接一轮,很难有人每套试卷都做到完美,但每次比上一次多涨几个经验点,后面的机会就会越来越大。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询