尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

神策数据秋招技术岗笔试复盘:SQL、统计与编程全攻略

神策数据秋招技术岗笔试复盘:SQL、统计与编程全攻略 神策数据的秋招技术岗笔试我在2023年第二批参加的。说实话看到笔试通知的时候还蛮紧张——神策是做用户行为分析和数据平台的公司技术岗的题不会只有算法大概率会连着考察SQL、统计和工程基础。整套卷子做完我的整体感受是题量中等偏大基础题占比高编程题不算难到离谱但SQL和统计题如果没有提前准备很容易翻车。这篇文章就结合我自己的复盘把笔试的题型、核心考点、解题思路和踩坑点整理出来给准备神策或其他数据类公司笔试的同学做个参考。不管你是科班出身还是半路转码这套复习思路应该都能用得上。1. 笔试整体流程复盘时间、平台、题型怎么分布1.1 第二批笔试的时间节点和形式2023年神策的秋招启动不算特别早我投的是技术岗第二批笔试通知大概在9月中下旬发出。第一批和第二批之间隔了差不多一周多所以如果你投得晚收到的就是第二批笔试。第二批不是“补录”性质也不是“备胎筛选”单纯就是按投递节奏分批安排这一点不用有心理压力。笔试是全程在线进行的和我参加过的其他校招笔试类似用的是牛客网平台需要用电脑答题并且要开摄像头。听说部分场次会要求屏幕录制我这场没有遇到但以防万一最好把浏览器清理干净不要开任何可能弹窗的页面。笔试时长给了120分钟题量大概在45道题左右包含选择、多选、编程和SQL。整张卷子对速度和准确率的要求都不低尤其是选择题如果你在数据结构上想太久后面的编程题会变得非常紧张。提示第二批笔试前通常已经有人分享过第一批的题目回忆。不建议完全依赖这些回忆因为题库会从不同题目中抽取但可以用来判断考点范围和出题风格。我自己的做法是把第一批提到的每类考点都列出来再逐一复习这样既节省时间也不会被“押中题”这种侥幸心态带偏。笔试当天建议提前30分钟进入在线考场把会弹出来的通知、聊天软件全部退出尤其要关掉各类弹窗因为很多笔试平台会监测切屏行为一旦被判定为离开页面轻则警告重则判定作弊。备一瓶水和两张草稿纸放在手边编程题先写思路再写代码不要上来就埋头敲。做题节奏上我的个人建议是选择题控制在60分钟内编程题每道15到20分钟SQL题10到15分钟最后留5分钟检查。1.2 技术岗考卷结构不是只有算法题我申请的是后端方向拿到试卷后发现结构和想象中不太一样。前面是单选题和多选题数量最多大概占了一半以上的分数然后有两道算法编程题最后还有一道SQL题以及一两道概率统计相关的题目。如果只是刷LeetCode就上考场大概率会在后半段吃大亏。更需要注意的试卷里的SQL题不是简单的增删改查而是和“用户事件”强相关。神策的主营业务就是帮助企业做用户行为分析像是事件分析、漏斗分析、留存分析、session分析都建立在数据表上。所以笔试考察SQL的思路会偏业务分析而不是纯数据库语法。另外概率统计题也是围绕转化率显著性、贝叶斯更新这类场景展开的这恰恰是很多科班同学容易忽略的部分。我整理了一下我这场的题型分布不一定每一批都一样但大致可以当作参考题型数量分值占比内容重点单选/多选35~4050%左右数据结构、操作系统、网络、语言基础编程题230%左右数组/字符串/动态规划SQL/统计题1~220%左右事件分析、留存率、显著性检验这样的结构意味着基础题如果拿不稳后面编程题再厉害也容易被压分。反过来如果在选择题上能快速稳定得分进入面试的概率会高很多。所以千万不要只准备算法而应该把数据分析和计算机基础放到同等重要的位置。2. 核心考点拆解选择题、编程题、SQL题分别踩哪些知识点2.1 选择题数据结构/网络/操作系统是拿分主力选择题的覆盖面比较像考研408但难度略低主要目的是筛掉基础不牢的人。数据结构常考二叉树前中后序遍历、平衡树的调整、哈希冲突处理、队列和栈的特性操作系统会考进程和线程的区别、死锁必要条件、虚拟内存、页面置换计算机网络考TCP三次握手、TCP和UDP差异、HTTP状态码、DNS解析过程。还会出现一些语言题比如Java的equals和区别、Python的列表和元组区别、垃圾回收的基本概念。多选题是这张卷子里比较烦的部分因为少选、多选都不得分。我当时的策略是“宁可少选不乱选”。如果一个选项不能百分百确认就不要勾它。不要想着多选还能得部分分这种多选题没有部分分的说法。复习的时候建议把每个知识点都当成判断题来记比如“进程是资源分配的最小单位线程是调度的最小单位”这类表述要能快速判断对错。单选里还会混一两道跟概率统计有关的题比如“某事件A和B互斥P(A)0.3P(B)0.4求P(A∪B)”这种送分题以及稍微绕一点的“两个随机变量独立方差分别是4和9求两者之差的方差”。这些题只要把概率论基础过一遍就没问题。值得提醒的是选择题分值虽不高但胜在量大稳定拿到80%以上的正确率会为整场笔试奠定非常好的基础。2.2 编程题重点看双指针、哈希和动态规划编程题一共两道从我的回忆来看难度接近LeetCode Medium的下限基本不会出现竞赛题。第一道是字符串或数组类的双指针或哈希题第二道稍微综合一点可能涉及动态规划或贪心。这两道题的分值不小而且平台支持多种语言选择自己最熟的语言就好不要在考场上尝试新语言。具体来说双指针题常见的有“最长不重复子串”“三数之和”“盛最多水的容器”哈希题有“两数之和”“字母异位词分组”动态规划常见有“最长递增子序列”“不同路径”“跳跃游戏”等等。时间有限的情况下不用把LeetCode所有Hard题刷完重点是见题型、懂套路。为什么神策会考这些因为做用户行为分析时最常见的操作就是处理时间序列、用户路径和事件流这些底层逻辑天然跟数组遍历、状态转移、去重统计强相关。有一件事值得特别提笔试平台的编程题和LeetCode不一样不会自动帮你处理输入输出。你需要自己从标准输入读数据并且按要求的格式打印结果。很多同学平时在LeetCode上填空习惯了直到笔试才发现不知道怎么写readline这非常亏。我建议准备阶段就用牛客网的模拟环境练至少十道题把IO写作当成基本功。2.3 SQL与统计题神策这类公司最容易被忽视的部分SQL题是神策笔试的“特色菜”。因为公司做的是用户行为分析所以题目一定会围绕用户事件表来出。事件表的结构一般长这样字段包含user_id、event_name、event_date、event_time、platform、channel等。要求计算的内容通常是每日新增用户数、次日留存率、某事件的漏斗转化率、不同渠道的转化对比。我这场遇到的SQL题是“求每日新增用户的次日留存率”这也是用户行为分析里最经典的问题。这类题目不要死记答案要理解“新增用户”和“留存用户”的定义新增用户 在某个日期第一次出现在事件表中的用户次日留存用户 这群人中的一部分在第二天还有任意事件记录。理解了定义SQL写起来就是套子查询和左连接。概率统计题的话我印象里考了一个“A/B测试显著性”的简答或选择两组样本转化率分别是8%和8.5%样本量各1000问这个差异是否显著。这需要用双比率z检验不能光看数值大小。这类题建议把z-score公式、p值的判断标准、以及“样本量对显著性影响”这几个点复习一遍。3. 笔试实操复盘三道典型题的解题全过程3.1 编程题实战合并区间的审题、实现与AC细节我考场上遇到的一道编程题是“合并区间”题目描述很简单给出一组区间的集合请合并所有重叠的区间返回合并后的区间列表。比如输入[[1,3],[2,6],[8,10],[15,18]]输出[[1,6],[8,10],[15,18]]。第一步是排序。先按区间起点从小到大排序这样可以保证我们只需要遍历一次。第二步是遍历每一个区间如果当前区间的起点大于结果中最后一个区间的终点说明不重叠直接加入结果否则说明重叠更新最后一个区间的终点为两者终点中较大的值。这个思路是典型的贪心加排序时间复杂度O(n log n)。下面是我当时写的Python版本注释也保留了def merge(intervals): if not intervals: return [] intervals.sort(keylambda x: x[0]) merged [] for interval in intervals: if not merged or merged[-1][1] interval[0]: merged.append(interval) else: merged[-1][1] max(merged[-1][1], interval[1]) return merged有几个细节会在笔试里坑人。第一输入为空数组时直接返回空数组别报错。第二[1,2]和[3,4]不算重叠因为2小于3所以用判断而不是但如果题目里明确说相邻也算重叠就要用。第三合并时终点要取更大的值比如[1,4]和[2,3]合并后是[1,4]不是[1,3]。在牛客网答题时还需要自己解析输入。一般来说输入是二维数组的字符串形式你可以选择用json.loads来解析也可以手动处理。用json.loads最省事但记得要import json。输出时把列表打印成标准二维数组的格式比如[[1,6],[8,10]]不要多打空格。这些细节决定了你能否一次AC。3.2 SQL实战新增用户次日留存率怎么写SQL题我给一个比较典型的写法。假设有一张用户行为事件表event_log字段包括user_id、event_date每个用户一天可能有多条记录。要求计算2023年8月每日的新增用户数以及这些新增用户在次日的留存率。先找“新增用户”也就是该用户第一次出现在事件表里的日期。可以用这样一段子查询select user_id, min(event_date) as first_date from event_log group by user_id然后在这个基础上统计每一天的新增用户数并关联次日是否有行为。一个比较容易理解的写法是with first_visit as ( select user_id, min(event_date) as first_date from event_log group by user_id ) select fv.first_date, count(distinct fv.user_id) as new_user_cnt, count(distinct e2.user_id) as retained_user_cnt, round(count(distinct e2.user_id) * 1.0 / count(distinct fv.user_id), 4) as retained_rate from first_visit fv left join event_log e2 on fv.user_id e2.user_id and e2.event_date date_add(fv.first_date, interval 1 day) where fv.first_date between 2023-08-01 and 2023-08-31 group by fv.first_date order by fv.first_date;这段SQL的关键点在于用min(event_date)来确定首访日期用left join保留所有新增用户包括次日没有回来的用户count(distinct ...)避免因为一天多条记录导致的重复计数round把留存率保留四位小数。如果平台上日期函数语法不同比如SQL Server用DATEADDMySQL用DATE_ADDOracle用1临时调整即可。我当时写的时候踩了个坑直接用了e2.event_date date_add(fv.first_date, interval 1 day)但忘了在left join里限定e2.user_idfv.user_id结果导致所有人被关联起来留存率完全错误。这种错误在本地看不出来但跑出来结果会很离谱。所以调试SQL时建议先跑select * from first_visit看首访日期是否正确再逐步看关联后的数据。3.3 概率统计实战两个方案的转化率怎么比除了SQL卷子里还有一道和A/B测试相关的概率统计题。题目大概是说某个页面有两个改版方案A和BA方案测试了1000个用户有80个转化B方案测试了1000个用户有95个转化。问B方案转化率是否显著高于A方案。这不是看95比80多就完事了要计算显著性。双比率z检验的公式是z (p2 - p1) / sqrt(p_pool * (1 - p_pool) * (1/n1 1/n2))其中p_pool是合并转化率等于(转化总数)/(样本总数)。这里用A、B两组的合并转化率作为零假设下的总体转化率近似。用Python可以快速算import math n1 1000 c1 80 n2 1000 c2 95 p1 c1 / n1 p2 c2 / n2 p_pool (c1 c2) / (n1 n2) se math.sqrt(p_pool * (1 - p_pool) * (1 / n1 1 / n2)) z (p2 - p1) / se print(p1, p2, z)算出来z值大概在1.17左右查标准正态分布表单尾p值大约为0.12大于0.05所以不能认为B方案显著优于A方案。这个结论很反直觉因为95比80看起来多了不少但样本量不够时统计上并不能排除随机波动。如果不做显著性检验直接上线B方案很可能上线后又观测不到稳定提升。这道题给我的教训是统计基础不是“会做选择题就行”在笔试里它可能以简答或综合分析的形式出现。准备的时候要把常见的假设检验流程、p值含义、中心极限定理都过一遍而不是只背公式。4. 笔试准备方法四周复习节奏与刷题策略4.1 四周路线图从基础到模拟的完整安排如果离笔试还有一个月左右可以按下面这个节奏复习。第一周主要用来过基础数据结构数组、链表、栈、队列、树、哈希表、计算机网络TCP/IP、HTTP、操作系统进程线程、死锁、内存管理。每天上午看理论下午刷对应的选择题晚上整理错题。错题本在这个阶段非常重要后期冲刺基本就是反复看错题。第二周进入刷题阶段目标是LeetCode hot 100里的高频题重点做数组、字符串、双指针、哈希表和动态规划这几类。每天保持两到三道高质量题不是做完就结束要总结每道题的复杂度、边界条件和最优解。我自己的方法是每道题写完之后在注释里补一段“为什么这样解”避免下次看到同样的题型还是没思路。第三周开始加入SQL和统计SQL可以刷牛客SQL题库中的“留存率、转化率、连续登录”题型统计重点看假设检验和z检验。第四周做模拟笔试用固定时间完成一套完整试卷训练时间分配。最好用牛客网的模拟场景因为越接近真实考试考场上越不容易慌。注意最后一周不要再刷难题了关键是形成“肌肉记忆”。我见过不少同学考前还在刷Hard题结果把大脑节奏搞乱反而在真正考试时表现不佳。考前两三天应该回归总结而不是追求新题。4.2 刷题取舍不同岗位该怎么分配精力后端、数据、算法岗的复习重点应该有所区别。后端岗更强调操作系统、网络、编程语言基础和数据结构算法题也会更多一些数据岗要更重视SQL、统计、数据建模编程题难度可以稍微降低算法岗则会加大算法题和统计学习题目的深度。我整理了一张供参考的优先级表岗位方向数据结构与算法计算机网络/OSSQL概率统计后端高高中低数据中低高高算法高低中高前端中中低低这张表不是绝对的但能帮助你不把时间浪费在低价值考点上。比如数据分析岗如果花大量时间去背路由协议性价比就很低更应该把用户留存、漏斗分析、A/B检验这类业务分析搞透彻。同样如果是后端岗也不能完全放弃SQL因为很多平台后面都会涉及数据存储和查询面试官也很看重工程师的数据意识。4.3 笔试前一天的设备调试和心态调整这件事看起来琐碎但每年都有人因为设备问题翻车。笔试前一天一定要做三件事第一确认电脑摄像头能正常打开并且浏览器允许摄像头权限第二找一面比较空的桌子把身份证件和草稿纸放在桌角方便监考老师查验第三提前登录笔试平台测试账号和网络如果用是校园网或者公司网建议提前切换成稳定的个人热点避免网络波动导致掉线。笔试当天的心态也很关键。很多人会因为一道选择题卡住然后脑子里不断回放“完了这次是不是凉了”结果后面几道题都在走神。我的做法是提前给自己设一个“单题止损时间”选择题超过2分钟就跳过编程题超过20分钟就先写暴力解法SQL题超过15分钟就先把主体框架写出来。把考试当成一次普通练习心态会稳很多。5. 常见问题与避坑指南实战中容易翻车的细节5.1 编程题最容易踩的五个坑第一个坑是空边界。很多同学看到题目就开始写核心逻辑忘记了输入为空、某个参数为null这些边界情况。笔试平台的测试用例里一定会有极端输入不处理就是答案错误。第二个坑是数组越界尤其是在双指针和滑动窗口里最容易在left和right移动时越界写完后最好在脑子里跑一遍示例数据。第三个坑在输入输出。牛客网的题目常常要求循环读取多组输入不能只处理一组数据就返回。第四个坑是溢出用C或Java时要小心整数相乘溢出Python不用太担心但也要注意时间复杂度和递归深度。最后一个坑是“不检查中间结果”有些题可以先暴力跑通再优化但直接在脑海里凭空优化很可能漏掉细节。我推荐边写边打印或者至少写完之后手动模拟一遍小数据。5.2 SQL题最容易踩的四个坑SQL题常见的坑相对固定。第一日期函数不熟不同数据库之间函数差异很大平时最好固定用一个数据库环境练习MySQL的DATE_ADD、DATEDIFF、DATE_FORMAT用得最多。第二新增用户定义错不要直接用event_date 2023-08-01下的用户因为那只是当天活跃用户不一定是新增用户。第三留存率的分母和分子口径不一致分子必须限制在分母的子集内否则会偏高。第四忘了处理一天多条记录导致计数重复应该用count(distinct user_id)。我建议在做SQL题之前先把表结构和字段含义读清楚甚至可以在草稿纸上写下“临时表A新用户临时表B次日行为用户”再开始写。这样能避免思路混乱。如果真的在时间紧张的情况下也不要空着不写可以先把with first_visit as (...)写出来有时候这就能拿到步骤分。5.3 做题时间不够时的应急策略如果做到最后发现时间不够不要慌先把自己会做的部分快速完成。选择题先填答案哪怕不确定也先蒙一个因为空着一定没分蒙了还有概率对。编程题如果完整解法没思路可以写暴力解法至少能过部分用例。SQL题如果完整查询写不出来先把子查询步骤写出来中间结果也可以得分。统计题先写出公式再代入数值算即使最后没算完也能展示思路。笔试考的其实不只是知识量还有在120分钟压力下保持稳定的能力。我看到过很多同学在编程题上纠结20分钟结果最后一道SQL题只留下一片空白。其实SQL题只要把主查询和子查询的基本框架搭出来就能拿到大多数分。所以时间分配远比做出一道完整难题重要这也是我反复在复盘里提醒自己的点。6. 笔试过后的准备与个人经验谈6.1 笔试之后还有哪些环节笔试通过后一般在一到两周内会收到面试通知。神策的面试流程通常不止一轮会有技术面、HR面也可能还有交叉面。技术面经常会追问笔试里的思路尤其是SQL题面试官可能会问“你为什么这么写”“如果数据量上亿这个查询会有什么问题”。所以笔试结束后不要立刻把题目忘掉应该趁热打铁复盘一遍特别要整理SQL题的优化思路。我当时在笔试后整理了一个“事件分析SQL常见套路”的笔记包含新增用户、留存漏斗、Session切分、渠道转化等场景。面试时被问到SQL相关问题我可以从这些场景里快速组织答案比临时想要稳得多。也建议在等待通知的期间继续刷题但不用像笔试前那样高密度保持每天一道算法题和两段SQL练习即可。如果笔试中是某道算法题没解出来面试前一定要把它补上。技术面试官很可能会问“笔试最后一题后来想明白了吗”这时候如果你能给出清晰的解法反而会变成加分项。因为面试官想看的不是你每次都完美而是你有没有复盘和成长的能力。6.2 我参加完这批笔试的最大体会整场笔试做下来我最深的感受是神策的笔试不是想用难题卡你而是在测试你有没有“技术基础 数据思维”的组合能力。编程题考的是基本功选择题考的是知识面SQL和统计题考的是能不能把技术应用到业务问题上。如果只按普通后端岗来准备很容易把重心全放在算法上忽略了数据分析能力。我个人的建议是投这类数据公司的技术岗笔试前一定要专门花一周时间补齐SQL和统计不要觉得“我是后端会写简单查询就够了”。实际上具备业务分析能力的工程师在公司里发展空间更大而笔试阶段就是这套价值观的第一次筛选。希望这篇复盘能帮你少走一些弯路也祝你在神策的下一批笔试里顺利通过。
返回列表