Intuit 26 NG SDE OA 一次过!SQL / 编程 / Bash 三题真题 + 保姆级思路解析
给定一张用户表(user_table),要求找出在三个指定属性(比如:email、phone、address,题目会明确给出具体字段)上完全相同的重复用户记录,最终输出这些重复用户的姓名(name),且姓名不能重复。给定一个n每一行的 4 个格子颜色必须互不相同。整个方格中,同一列不能出现颜色完全相同的情况(即:不存在某一列,所有行的颜色都一模一样)。求满足条件的排列方案总数。忽略大小写,全部转为
最近 Intuit 开始集中发 26 届 NG SDE 的 OA 了,我刚做完这套题一次通关,整体感受:不刁钻、不挖坑,纯考你是不是真的写过代码、会不会基础知识点的实际应用。
Intuit 这家公司的题风真的多年没变,稳重得一批,只要不慌不忙按步骤来,时间完全够用,不用怕做不完。今天就把这套 OA 的三道题(SQL + 编程 + Bash)的核心思路、踩坑点全部分享出来,给后续要考的同学避避坑,有 OA/VO 相关问题也可以在评论区交流~

先唠两句:Intuit OA 整体感受
- 题型固定:混合题型(SQL + 编程 + 脚本),不考超纲算法,重点是基础能力落地。
- 时间充裕:三道题难度都不高,每道题留足时间梳理思路,不用赶进度。
- 淘汰点:不是 “不会做”,而是细节失误(比如 SQL 分组条件写错、正则漏考虑边界)、思路卡壳(比如组合计数没想起容斥原理)。
Q1:数据库重复用户查询(SQL 题)
题目简介
给定一张用户表(user_table),要求找出在三个指定属性(比如:email、phone、address,题目会明确给出具体字段)上完全相同的重复用户记录,最终输出这些重复用户的姓名(name),且姓名不能重复。
核心要求
只有当三个属性同时全部相同,才算同一批重复用户;最终输出的姓名去重,避免同一个姓名重复出现。
解题思路
这是一道标准的 GROUP BY 分组去重 + 筛选 题,完全不用复杂子查询,核心就是 “分组条件不能错”。
- 分组依据:直接按照题目给定的三个属性进行
GROUP BY,这一步是关键,千万不能拆分成单个属性分别分组,否则会把 “部分相同” 的用户误判为重复。 - 筛选重复分组:使用
HAVING COUNT(*) > 1筛选出 “记录数大于 1” 的分组,这些就是存在重复的用户组(因为只有重复才会分组后计数超过 1)。 - 提取并去重姓名:从筛选出的重复分组中,提取对应的用户姓名,最后用
DISTINCT对姓名去重,得到最终结果。
踩坑提醒
- 不要忘记最终姓名需要
DISTINCT去重,题目要求输出 “重复用户的姓名”,不是 “重复记录的姓名”。 HAVING后面跟聚合函数(COUNT (*)),不能用WHERE,新手容易搞混两者的使用场景。
Q2:n 行 4 列方格的颜色排列方案数(编程题)
题目简介
给定一个 n 行 4 列的方格,满足两个约束条件:
- 每一行的 4 个格子颜色必须互不相同。
- 整个方格中,同一列不能出现颜色完全相同的情况(即:不存在某一列,所有行的颜色都一模一样)。求满足条件的排列方案总数。
解题思路
这题本质是 组合计数问题,核心是用「容斥原理」处理 “不合法情况”,先算总方案数,再减去不合法方案数,得到最终合法方案数。
步骤 1:计算无列约束的总方案数
首先不考虑 “列颜色完全相同” 的约束,只看每一行的要求:
- 每一行 4 个格子颜色互不相同,就是 4 个颜色的全排列,方案数为
4! = 24种。 - n 行相互独立,因此无列约束的总方案数为
24^n(24 的 n 次方)。
步骤 2:用容斥原理剔除不合法方案数
不合法情况:存在至少一列,所有行的颜色完全相同。我们需要用容斥原理,依次处理 “1 列相同”、“2 列相同”、“3 列相同”、“4 列相同” 的情况(4 列全部相同已包含在前面的情况中,无需额外处理)。
容斥原理的核心逻辑:总合法数 = 总方案数 - 任意 1 列相同的方案数 + 任意 2 列相同的方案数 - 任意 3 列相同的方案数
具体计算拆解:
- 任意 1 列相同:从 4 列中选 1 列(C (4,1)),这一列所有行颜色相同(只有 1 种选择 per 列),其余 3 列满足 “每行颜色不同” 且无列约束。每一行其余 3 列的方案数是
3! = 6,n 行就是6^n,因此这部分总不合法数为C(4,1) * 6^n。 - 任意 2 列相同:从 4 列中选 2 列(C (4,2)),这 2 列所有行颜色相同,其余 2 列每行颜色不同,每一行其余 2 列方案数
2! = 2,n 行就是2^n,这部分数为C(4,2) * 2^n(这部分是 “多减了”,需要加回来)。 - 任意 3 列相同:从 4 列中选 3 列(C (4,3)),这 3 列所有行颜色相同,其余 1 列每行颜色不同(只有 1 种选择 per 行),n 行就是
1^n = 1,这部分数为C(4,3) * 1^n(这部分是 “多加了”,需要再减去)。
步骤 3:最终公式
将上述结果代入容斥原理,得到最终合法方案数:
合法方案数
踩坑提醒
- 不要遗漏容斥原理的 “加减交替”,新手容易只减不加分,导致结果偏小。
- 组合数 C (4,k) 计算要准确:C (4,1)=4、C (4,2)=6、C (4,3)=4。
Q3:文本清洗与单词拆分(Bash / 字符串处理题)
题目简介
给定多行输入文本,要求对文本进行统一清洗处理,最终拆分为合规的单词序列输出,具体要求:
- 忽略大小写,全部转为小写。
- 过滤非法字符(只保留字母和数字,其余均为非法)。
- 拆分为独立单词序列,无空字符串、无多余空格。
解题思路
这是典型的 字符串处理 + 正则表达式 题,流程固定,只要按步骤来,基本不会出错,考察的是你对文本处理工具的熟练度(Bash 中可用 sed、tr,编程中可用正则库)。
这里提供两种思路:Bash 脚本实现 & 通用编程实现(Python 为例),核心流程一致。
核心流程(四步走)
- 拼接 + 转小写:将多行输入拼接成一个完整字符串,统一转换为小写,消除大小写差异。
- 过滤非法字符:使用正则表达式,将所有 “非字母、非数字” 的字符替换为空格。
- 拆分单词:以空格为分隔符,将字符串拆分为初步的单词列表。
- 过滤空字符串:拆分过程中会产生空字符串(比如多个连续非法字符替换为多个空格,拆分后出现空值),过滤掉这些空值,得到最终合规单词列表。
实现示例
示例 1:Bash 脚本实现
bash
运行
# 读取多行输入,拼接为完整字符串,后续分步处理
cat input.txt | \
tr '[:upper:]' '[:lower:]' | \ # 步骤1:转为小写
sed 's/[^a-z0-9]/ /g' | \ # 步骤2:非法字符替换为空格
tr -s ' ' | \ # 步骤3:压缩多个连续空格为单个空格
tr ' ' '\n' | \ # 按空格拆分,每行一个单词
grep -v '^$' # 步骤4:过滤空行(空字符串)
示例 2:Python 实现
python
运行
import re
def clean_and_split_text(text):
# 步骤1:转为小写
lower_text = text.lower()
# 步骤2:非法字符替换为空格(正则:匹配非字母、非数字的字符)
valid_text = re.sub(r'[^a-z0-9]', ' ', lower_text)
# 步骤3:拆分单词 + 步骤4:过滤空字符串
word_list = [word for word in valid_text.split() if word]
return word_list
# 测试:读取多行输入
if __name__ == "__main__":
import sys
# 读取所有输入行
input_text = ''.join(sys.stdin.readlines())
result = clean_and_split_text(input_text)
# 输出单词序列
for word in result:
print(word)
踩坑提醒
- 正则表达式不要写错:
[^a-z0-9]表示 “匹配除了小写字母和数字之外的所有字符”,新手容易漏写^(取反)。 - 拆分后一定要过滤空字符串,否则会输出多余的空值,不符合题目要求。
最后:Intuit OA & 面试小建议
- 心态放平:Intuit 的 OA 真的不难,重点是 “稳”,不要追求快,先梳理清楚思路再动手写。
- 重视细节:SQL 的
GROUP BY与HAVING、容斥原理的加减交替、正则的边界匹配,这些细节是淘汰人的关键。 - 提前熟悉题型:Intuit 题风稳定,多刷往年真题,熟悉混合题型的答题节奏,避免临场紧张。
如果有同学需要 OA 真题模拟、面试辅助、VO 流程梳理,也可以在评论区交流,我会尽量帮忙解答~
更多推荐


所有评论(0)