ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

360春招笔试复盘:从字符串模拟到贪心二分的工程化考查

360春招笔试复盘:从字符串模拟到贪心二分的工程化考查 1. 先说说360笔试的题量布局和时间分配2023年春招笔试第二批我实际参加下来整体感觉和互联网大厂常见的两道编程题搞定一场笔试的路子不太一样。360的笔试系统里编程题占大头但不是全部前面还有一块在线评测的选择/填空类题目考查范围涵盖了操作系统、网络、数据结构这些计算机基础后面才是2到3道完整的编程题。这个结构意味着你没法靠背题应付基础不扎实的人在第一阶段就会开始掉血。从题目类型来看第二轮批次的题比第一批更偏向把算法落到工程场景的考法。第一批里有一些纯模板题比如直接给一个数组让你排序、让你写个链表反转属于热身性质第二批则明显加了业务背景的包装题干会故意写得很长铺陈一个产品场景然后让你抽象出数学模型。这和360的安全、搜索、IoT硬件这些业务方向是挂钩的——它在考察你能不能从混乱的需求里提取出清晰的算法问题。时间上整套题给的时间大约是90分钟选择题和编程题共用。我的建议很直白前面基础题控制在25分钟以内不要恋战。基础题分值虽然单题不高但数量多、覆盖面广做太快容易粗心做太慢会挤压后面编程题的时间。编程题里最简单的第一题要在15分钟内搞定第二题控制在25到30分钟最后一道如果思路卡了超过15分钟别死磕先把能过的样例拿到手。这里有一个很多人容易忽略的点360的笔试系统用的是类LeetCode的提交方式但它的本地IDE默认不会帮你做语法检查编译报错直接显示一大段英文日志心态不好的当场就慌了。我建议在进笔试之前先熟悉一下你常用语言在命令行里编译运行的报错格式至少能快速定位是缺头文件、名称写错还是类型不匹配。再说分值结构。第二批的编程题总分在整张卷子里占比大约60%剩下40%分散在基础题里这意味着哪怕编程题全都AC基础题拿个两三成总分依然不保险。反过来如果编程题只写出一道半基础题好好做也能稳过简历关。所以我的策略一直是编程题保证前两道的高正确率第三道当作冲刺题基础题不允许空题不会的也要按常识排除掉明显错误选项。2. 字符串与模拟题这批题目里最不能丢的分360笔试编程题第一题几乎所有批次都喜欢出字符串处理或者状态模拟类题目2023年第二批也不例外。这类题的特点是算法思想不深但逻辑分支很多题干里会塞进一堆限制条件考察的是你稳不稳。我印象里有一道题是给出一段经过规则处理的字符串要求还原出原始内容。题目给的规则不算复杂但存在嵌套情况比如某个标记可以嵌套在另一段标记内部而且处理顺序是从左到右。第一次读题时很容易主观认为用正则替换就行仔细想才发现正则处理嵌套是行不通的。这类题的正解是用栈来维护嵌套层级。具体思路是遍历字符串遇到左标记时把当前状态压栈进入新的层级遇到右标记时弹出栈顶恢复上一层状态。这里有一个关键细节弹出的时机不是遇到右标记的当下而是要在把当前层级的缓冲区处理完之后再弹栈否则嵌套内容的顺序会乱掉。我当时写代码时踩了一个很典型的坑字符串拼接的性能。第一版实现里我在每层用一个String对象做累加测试数据量小的时候看不出问题但数据量一旦到10万级别字符串拼接的时间复杂度会退化到O(n²)直接超时。换成StringBuilder或者用数组模拟字符缓冲区之后时间瞬间降到个位数毫秒。模拟题的另一个坑在边界条件。题目里往往会出现空串只有标记没有内容标记嵌套深度为1这类边缘输入很多人的代码在常规用例上全过一遇到空串就直接抛异常。我写完后会特意构造几个极端的输入跑一遍比如全空字符串、只有一对空标记、标记内部只有空格。这些小习惯考场上是能实实在在救命的。还有一点值得单独说输出格式。360的判题系统对输出要求非常严格多一个空格、少一个换行都会判错。字符串还原类的题如果结果本身包含前后空格直接Trim掉会导致答案错误。我通常的做法是严格按照题目给的输出示例来检查不确定时宁可不做额外处理只做最保守的格式化。3. 贪心和二分春招笔试里的高频核心第二批编程题的第二题风格上明显比第一题有算法含量但也没有直接出动态规划这种重型题目而是集中在贪心和二分这两个方向上。这其实反映了笔试出题的一个潜规则校招笔试不是ACM它不指望你45分钟手撕一个网络流而是考察你在常见算法模型里能不能快速找到正确的切入路径。贪心题在这一批里出现了一道让我印象很深的一系列任务每个任务有开始时间和结束时间同一个资源只能同时处理一个任务问最多能完成多少个任务。这个题目本质是经典的活动选择问题解法是按结束时间排序然后贪心地选择结束时间最早且与前一个已选任务不冲突的任务。难点不在于排序本身而在于题目套了一个资源预热时间的壳。每个任务结束之后资源需要一段冷却时间才能处理下一个任务冷却时间可能是固定的也可能随任务不同而变化。如果是固定冷却时间只需要在判断冲突时把下一个任务的开始时间大于等于当前任务结束时间改成大于等于当前任务结束时间加冷却时间如果冷却时间不固定就需要对每个任务额外维护一个属性排序时按结束时间加自身冷却时间来排。二分题则更典型几乎可以确定是二分答案类。题目大致是给一组工位和一组员工要求分配员工到工位希望最大化所有工位里员工数量最多的那个值但这里的特殊之处在于某些工位有容量上限某些员工有位置依赖求最小化最大负载。这类题的套路非常固定判断函数里用贪心或者模拟验证如果最大负载限制为x是否能分配完成然后对x做二分查找。写二分的时候我推荐一个几乎不会出错的写法左边界取可能的最小值右边界取一个绝对足够大的值循环条件是左边界小于右边界每次取中值midleft(right-left)/2。判断函数返回可行时把右边界收缩到mid否则把左边界移到mid1。最后循环结束时左边界就是答案。有人在二分查找里纠结用mid还是mid1其实只要记住可行就收右边不可行就收左边这个原则就不会死循环。贪心和二分结合起来还有一个隐藏考点证明贪心策略的正确性。虽然笔试不要求写证明文本但如果你在写代码之前想清楚了为什么按结束时间排序是最优的代码写起来会顺畅很多。想不清楚的时候可以先写个暴力回溯跑小规模数据和贪心结果对拍一下确认无误再提交。我私底下刷题时经常这么做考场虽然没时间写完整对拍但这个习惯会逼着你想清楚边界条件。4. 安全与系统向题目结合360业务背景的考查方向360的笔试比起其他互联网公司有一个非常鲜明的特点会出少量和安全、系统底层相关的题哪怕是编程题也偶尔会披着日志分析数据校验的外衣。2023年第二批的编程题里至少有一道题在题意上涉及了数据完整性校验如果你完全没接触过校验和、哈希这类概念读题就会卡住。这道题的场景是系统产生了一串日志记录每条记录包含时间戳、级别、内容三部分要求把满足特定条件的记录抽取出来并按时间排序输出。表面上是字符串处理加排序排序的key是时间戳。但题目里埋了一个小陷阱时间戳的单位是毫秒级而且是字符串形式直接用字典序排序在位数不一致时会出错。比如20230210120001和2023021012001前者是13位后者是12位字典序排序会把后者排到前面但实际时间顺序应该是前者靠前。正确做法是先把时间戳字符串解析成整数或者标准时间对象再排序。这里我推荐转成整数因为标准时间对象的解析在部分语言里会牵扯时区问题而纯数字解析是最稳妥的。解析过程里要注意前导零时间戳虽然是数字但可能以0开头转成int的时候不要丢掉前导零——虽然排序用int没问题但输出时如果需要原样输出就得保留原始字符串。另一道和系统底层沾边的题涉及二进制位的操作。题目给出一组分片数据和一个校验值要求判断哪些分片损坏了。实际解法是把每个分片转成一个整数用异或运算逐片累积最后和校验值比较。异或在这里的价值很直观如果有某一片的数据被篡改累积结果和校验值必然不一致而且可以通过分组的方式定位到具体是哪一块。这类题目背后其实映射了360业务里真实在用的技术数据完整性校验、日志结构化、异常检测。你能感觉到出题人不是单纯想考你算法套路而是希望招进来的工程师在写业务代码时能对数据流有一种敏感度——知道数据从哪来、经过什么处理、到哪里去、中间可能发生什么异常。给准备这类题的同学一个建议不必专门去啃安全工程的书但要把位运算、字符串编码、哈希这些基础概念理解透。笔试考的永远是概念和代码的映射不会考如何破解某个加密算法。把异或、与、或、位移运算的优先级和结合性背清楚考场上能少掉很多头发。5. 边界条件、复杂度与代码风格的考场实战细节编程题真正拉开差距的往往不是算法思路本身而是边界条件和复杂度控制。360的判题系统比较严格有几个数据点专门卡边界我身边不少人看到通过率90%后卡在那里半天就是因为循环变量差了一个等号。先说说复杂度估算的实战方法。笔试时你没法写代码验证超时不超时只能在写之前心里算一笔账。常规的经验值是1秒大概能跑10的8次方次简单操作2秒能跑2到3倍的量。如果题目给的数据范围是n≤10^5那么O(n²)的算法就是10^10次操作必然超时O(n log n)是大约1.7×10^6次稳定没问题。所以拿到题先看数据范围再定算法这是铁律。具体到实现层面有几种常见的低效写法要警觉字符串拼接前面已经说过、数组的无序删除、频繁的容器拷贝、在循环里重复计算长度属性。以数组删除为例如果你在一个长度10^5的数组里反复删除元素每次删除都是O(n)的总体就是O(n²)。正确做法是改用标记数组延迟删除或者用双指针从后往前覆盖。边界条件的检查我有一套固定的自查流程每次提交前都会过一遍数组或字符串为空的情况数组或字符串长度为1的情况所有元素相同时的表现数值达到题目给定上限时是否有溢出输入中有重复值时是否影响结果排序后第一个和最后一个元素的特殊逻辑这套流程在实际笔试里帮我排查出过不少bug。比如有一道题需要求子数组的最大平均值我最初写的代码在数组长度恰好等于子数组长度时循环条件少判断了一次导致结果差了一截。后来养成了这个自查习惯这类问题基本能在提交前发现。另外代码风格在笔试里看起来不重要其实很影响发挥。变量命名要有意义函数拆成小块关键步骤写注释不是为了给判题系统看而是为了让自己在40分钟之后还能看懂自己的代码。我见过很多人在最后一道题上写了一大坨逻辑结果跑出错误后找不到bug位置就是因为变量名全是a、b、c函数没有拆分改一处崩三处。我自己的习惯是主函数只做输入解析和调用每个算法步骤单独抽成一个函数函数名直接说明它的用途比如findMinLoad、canDistribute。这样即使最后时间不够打个日志也能很快定位问题。还有一个考场小技巧对输入规模较大的题目别用Scanner逐行读用缓冲流按块读入速度能提升好几倍数据量上百万时体验尤其明显。6. 复盘这套题之后我对春招笔试的几点观察整套题做下来我最大的感受是360笔试的出题风格在工程化和基础扎实之间找平衡。它不是那种纯考智力的题也不是纯考背书的题更像是一个信号我们希望候选人既能快速建模也能写出健壮的代码还能对业务场景有基本认知。观察之一字符串和模拟题几乎必然出现在第一道编程题。这类题不区分竞赛选手和普通科班生所有人处在同一起跑线拼的就是细心和代码基本功。在准备春招时不要只刷动态规划和图论把字符串处理、栈、队列、哈希表的经典题型每种刷上20道基础分就能稳稳抓住。观察之二贪心和二分是性价比最高的复习方向。它们不像动态规划那样需要大量思路训练核心套路就那么多掌握判断函数的写法、边界调整的逻辑就能应对大多数变体。我建议把二分答案的通用模板背下来现场会省下大量思考时间。这个模板在360笔试里反复出现我甚至怀疑它的题库里有多道同源变形题。观察之三笔试前一定要做一次全真模拟。完整空出90分钟打开牛客或者360自己的在线练习系统按真实考试的时间压缩来做题卡着表不延时不暂停。我在第一次模拟时发现前25分钟做基础题时贪了几道导致编程题时间紧张第二题草草提交只过了一半测试用例。后来调整了时间分配第二题压到25分钟内完成正确率明显提升。考场上最大的敌人不是题目难而是节奏乱。还有一点对2023届的同学尤其适用春招第二批的竞争比第一批更激烈因为很多人的简历还在流程里池子越滚越大。笔试分数成了筛人的硬指标这就更要保证简单题不丢分、中档题多拿分、难题尽力写。我在这一轮笔试之后进入面试面试官其实没有太抠笔试细节更多是问项目经历和基础八股但笔试通过是这一切的前提。回顾整场笔试我觉得最值得带走的不是哪道题的解法而是一个认知校招笔试不是竞赛它在考核的是在有限时间内稳定交付可用代码的能力。三道编程题你能完整做出两道剩下那道写出一半的暴力解法并注释清楚思路再加上基础题拿个中等偏上的分数就已经赢过多数人了。剩下的就让平时的积累去回答。
返回列表