最近 Intuit 开始集中发 26 届 NG SDE 的 OA 了,我刚做完这套题一次通关,整体感受:不刁钻、不挖坑,纯考你是不是真的写过代码、会不会基础知识点的实际应用

Intuit 这家公司的题风真的多年没变,稳重得一批,只要不慌不忙按步骤来,时间完全够用,不用怕做不完。今天就把这套 OA 的三道题(SQL + 编程 + Bash)的核心思路、踩坑点全部分享出来,给后续要考的同学避避坑,有 OA/VO 相关问题也可以在评论区交流~

先唠两句:Intuit OA 整体感受

  1. 题型固定:混合题型(SQL + 编程 + 脚本),不考超纲算法,重点是基础能力落地。
  2. 时间充裕:三道题难度都不高,每道题留足时间梳理思路,不用赶进度。
  3. 淘汰点:不是 “不会做”,而是细节失误(比如 SQL 分组条件写错、正则漏考虑边界)、思路卡壳(比如组合计数没想起容斥原理)。

Q1:数据库重复用户查询(SQL 题)

题目简介

给定一张用户表(user_table),要求找出在三个指定属性(比如:email、phone、address,题目会明确给出具体字段)上完全相同的重复用户记录,最终输出这些重复用户的姓名(name),且姓名不能重复。

核心要求

只有当三个属性同时全部相同,才算同一批重复用户;最终输出的姓名去重,避免同一个姓名重复出现。

解题思路

这是一道标准的 GROUP BY 分组去重 + 筛选 题,完全不用复杂子查询,核心就是 “分组条件不能错”。

  1. 分组依据:直接按照题目给定的三个属性进行 GROUP BY,这一步是关键,千万不能拆分成单个属性分别分组,否则会把 “部分相同” 的用户误判为重复。
  2. 筛选重复分组:使用 HAVING COUNT(*) > 1 筛选出 “记录数大于 1” 的分组,这些就是存在重复的用户组(因为只有重复才会分组后计数超过 1)。
  3. 提取并去重姓名:从筛选出的重复分组中,提取对应的用户姓名,最后用 DISTINCT 对姓名去重,得到最终结果。

踩坑提醒

  • 不要忘记最终姓名需要 DISTINCT 去重,题目要求输出 “重复用户的姓名”,不是 “重复记录的姓名”。
  • HAVING 后面跟聚合函数(COUNT (*)),不能用 WHERE,新手容易搞混两者的使用场景。

Q2:n 行 4 列方格的颜色排列方案数(编程题)

题目简介

给定一个 n 行 4 列的方格,满足两个约束条件:

  1. 每一行的 4 个格子颜色必须互不相同。
  2. 整个方格中,同一列不能出现颜色完全相同的情况(即:不存在某一列,所有行的颜色都一模一样)。求满足条件的排列方案总数。

解题思路

这题本质是 组合计数问题,核心是用「容斥原理」处理 “不合法情况”,先算总方案数,再减去不合法方案数,得到最终合法方案数。

步骤 1:计算无列约束的总方案数

首先不考虑 “列颜色完全相同” 的约束,只看每一行的要求:

  • 每一行 4 个格子颜色互不相同,就是 4 个颜色的全排列,方案数为 4! = 24 种。
  • n 行相互独立,因此无列约束的总方案数为 24^n(24 的 n 次方)。
步骤 2:用容斥原理剔除不合法方案数

不合法情况:存在至少一列,所有行的颜色完全相同。我们需要用容斥原理,依次处理 “1 列相同”、“2 列相同”、“3 列相同”、“4 列相同” 的情况(4 列全部相同已包含在前面的情况中,无需额外处理)。

容斥原理的核心逻辑:总合法数 = 总方案数 - 任意 1 列相同的方案数 + 任意 2 列相同的方案数 - 任意 3 列相同的方案数

具体计算拆解:

  1. 任意 1 列相同:从 4 列中选 1 列(C (4,1)),这一列所有行颜色相同(只有 1 种选择 per 列),其余 3 列满足 “每行颜色不同” 且无列约束。每一行其余 3 列的方案数是 3! = 6,n 行就是 6^n,因此这部分总不合法数为 C(4,1) * 6^n
  2. 任意 2 列相同:从 4 列中选 2 列(C (4,2)),这 2 列所有行颜色相同,其余 2 列每行颜色不同,每一行其余 2 列方案数 2! = 2,n 行就是 2^n,这部分数为 C(4,2) * 2^n(这部分是 “多减了”,需要加回来)。
  3. 任意 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 / 字符串处理题)

题目简介

给定多行输入文本,要求对文本进行统一清洗处理,最终拆分为合规的单词序列输出,具体要求:

  1. 忽略大小写,全部转为小写。
  2. 过滤非法字符(只保留字母和数字,其余均为非法)。
  3. 拆分为独立单词序列,无空字符串、无多余空格。

解题思路

这是典型的 字符串处理 + 正则表达式 题,流程固定,只要按步骤来,基本不会出错,考察的是你对文本处理工具的熟练度(Bash 中可用 sedtr,编程中可用正则库)。

这里提供两种思路:Bash 脚本实现 & 通用编程实现(Python 为例),核心流程一致。

核心流程(四步走)
  1. 拼接 + 转小写:将多行输入拼接成一个完整字符串,统一转换为小写,消除大小写差异。
  2. 过滤非法字符:使用正则表达式,将所有 “非字母、非数字” 的字符替换为空格。
  3. 拆分单词:以空格为分隔符,将字符串拆分为初步的单词列表。
  4. 过滤空字符串:拆分过程中会产生空字符串(比如多个连续非法字符替换为多个空格,拆分后出现空值),过滤掉这些空值,得到最终合规单词列表。

实现示例

示例 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 & 面试小建议

  1. 心态放平:Intuit 的 OA 真的不难,重点是 “稳”,不要追求快,先梳理清楚思路再动手写。
  2. 重视细节:SQL 的 GROUP BYHAVING、容斥原理的加减交替、正则的边界匹配,这些细节是淘汰人的关键。
  3. 提前熟悉题型:Intuit 题风稳定,多刷往年真题,熟悉混合题型的答题节奏,避免临场紧张。

如果有同学需要 OA 真题模拟、面试辅助、VO 流程梳理,也可以在评论区交流,我会尽量帮忙解答~

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐