[Interview] 小红书28届实习 Product Engineer-产品工程师(Al全栈or应用研发方向)笔试测评
Categories Interview
Tags
说明
- 测评平台:赛码网
- 简历在官网通过初筛之后会收到测评邮件,可以选择三场任意一场测评参加,我选择的是最后一场
考试信息1|时间:2026-10-13 19:00-21:00 星期二 考试信息2|时间:2026-10-15 19:00-21:00 星期四 考试信息3|时间:2026-10-18 19:00-21:00 星期日 - 测评开始之前可以做练习题,练习题的算法部分好像有一个水仙花数,但是练习的题好像和正式测评没有太大关系。
- 开始测评之后可以选择题型,印象中有客户端(大前端)、Java、CPP、Python、Golang 等可以选择,猜测选择不同方向会出一些相对应方向的题目
- 题型是20道计算机基础+3道算法,计算机基础涵盖了 Golang 基础(4-5题)、数据结构(4-5题)、计算机网络(1-2题)、操作系统(3-4题)、后端基础(1题,但是可能也可以算作 Golang 基础)、数据库(2-3题)、SQL(2-3题)、Linux Shell 语法(1题),没有考察 Redis、消息队列等知识
- 算法前两道题感觉都是纯模拟,直接暴力解答即可;最后一题应该要一些算法技巧,很可惜完全做不出来。三道题都不是 Hot100 原题
选择题
有单选也有多选,实在记不下太多了,回忆一下。。。
- Golang 的 Slice 的扩容机制,例如是否修改 slice 也会修改底层数组、append 时是否自动扩容、容量是否一定大于长度、slice 长度较大之后是否不会直接翻倍扩容等等
- HTTP 的特性,具体表述因为我不会所以没记住。。。
- 几种 CPU 调度方式,例如 FCFS、RR、HRRN、SRTF 区别、计算有上下文开销时系统切换的占比
- 应该是两道看表选出符合要求正确的 SQL 语句,感觉比较简单比较好排除,知道 JOIN / GROUP BY 这类的基本语法应该就能选出来了
- 聚簇索引、普通索引等等的区别,还有若干数据库的题目因为看不懂题目无法想起了
- 哈夫曼编码,给定一些字母的出现频率,求带权路径的和
- 小顶堆删去堆顶的比较次数
- KMP 算法模式串的移动次数
- 二分查找比较次数
- Shell 指令提取 csv 的内容
- 软连接硬连接和源文件的 inode
编程题
以下为大模型通过我的代码整理出来的题面,与原题表述不一致但解答方法一致
1. 连续正整数的乘积(魔法数字)
题目描述
定义一个正整数 为「魔法数字」,当且仅当它可以表示成至少三个连续正整数的乘积。
即存在两个正整数 ,满足:
且
给定 个正整数,请判断每个整数是否为魔法数字。
输入描述
第一行输入一个正整数 ,表示询问次数。
接下来 行,每行输入一个正整数 。
参考历史题面,。
输出描述
对于每次询问,如果是魔法数字,输出 YES;否则输出 NO。
样例
输入
3
6
2
24
输出
YES
NO
YES
参考代码(AC)
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
fmt.Fscan(in, &n)
a := make([]int, n)
for i := 0; i < n; i++ {
fmt.Fscan(in, &a[i])
}
for i := 0; i < n; i++ {
num := a[i]
ok := false
for idx := 1; idx*(idx+1)*(idx+2) <= num; idx++ {
j := idx
sum := 1
for j <= num && sum < num {
sum *= j
j++
}
if num == sum && j-idx >= 3 {
// fmt.Fprintln(out, idx, j)
fmt.Fprintln(out, "YES")
ok = true
break
} else {
continue
}
}
if !ok {
fmt.Fprintln(out, "NO")
}
// fmt.Fprintln(out, sum)
}
}
// 10 * 11 * 12 = 1320
2. 01 字符串的连续删除
题目描述
给定一个长度为 的字符串 ,仅由字符 0 和 1 组成。
每轮执行以下操作:
- 对于每一个字符,寻找其右侧第一个与自身不同的字符。如果存在,则标记该字符。
- 本轮所有标记同时进行,同一个位置即使被多次标记,也只计一次。
- 删除所有被标记的字符,剩余字符按原顺序拼接成新的字符串。
重复执行以上操作,直到没有任何字符被标记。
请计算整个过程中总共删除了多少个字符。
等价地,每一轮删除所有相邻不同字符对中的右侧字符,注意必须先统一标记,再同时删除。
输入描述
第一行输入正整数 ,表示字符串长度。
第二行输入长度为 的字符串 ,保证仅包含 0 和 1。
输出描述
输出一个整数,表示整个过程中删除的字符总数。
样例 1
输入
5
11101
输出
2
初始字符串为 11101,第一轮删除第 4、5 个字符,剩余 111,操作结束。
样例 2
输入
6
001100
输出
4
执行过程:
001100
↓ ↓
0010
↓↓
00
最终剩余两个字符,共删除四个。
参考代码(AC)
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
fmt.Fscan(in, &n)
s := ""
fmt.Fscan(in, &s)
a := make([]int, n)
for i := 0; i < n; i++ {
a[i] = int(s[i] - '0')
}
// fmt.Fprintln(out, a)
isEnd := false
idxs := []int{}
for !isEnd {
isEnd = true
for i := 0; i < len(a)-1; i++ {
if a[i+1]^a[i] == 1 {
idxs = append(idxs, i+1)
isEnd = false
}
}
// fmt.Fprintln(out, a, idxs)
for i, v := range idxs {
a = append(a[:v-i], a[v+1-i:]...)
}
idxs = []int{}
// fmt.Fprintln(out, a, idxs)
}
fmt.Fprintln(out, n-len(a))
}
3. 字典序最小的频率非降字符串
题目描述
给定一个长度为 的字符串 ,仅由小写英文字母组成。
你可以删除字符串中的任意若干字符,但不能改变剩余字符的相对顺序。
要求删除后得到的字符串 满足:
其中 表示字母 在字符串 中的出现次数。
需要满足以下两个优化目标,优先级从高到低:
- 删除的字符数量尽可能少。
- 在删除次数最少的所有合法方案中,选择字典序最小的结果字符串。
输出最终得到的字符串。
特别注意:未出现的字母出现次数视为 0,也参与上述比较。
输入描述
第一行输入一个正整数 ,表示字符串长度。
第二行输入一个长度为 的字符串 。
数据范围:
- 仅包含小写英文字母
- 保证 中至少出现一个
z
输出描述
输出一行字符串,表示删除次数最少且字典序最小的合法结果。
样例 1
输入
4
xyxz
输出
xyz
原始频次:
至少要删除一个 x,可以得到 xyz 或 yxz,选择字典序最小的 xyz。
样例 2
输入
3
azz
输出
zz
参考代码(WA)
(这个实现是错误的,通过率仅 9%)
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n int
fmt.Fscan(in, &n)
s := ""
fmt.Fscan(in, &s)
m := [26]int{}
b := []byte{}
for _, c := range s {
m[c-'a']++
b = append(b, byte(c))
}
// // 1 2 1 3
// // b a d b c d d
isSorted := false
for !isSorted {
isSorted = true
for i := 0; i < 25; i++ {
if m[i] <= m[i+1] {
continue
} else {
isSorted = false
c := byte('a' + i)
times := m[i] - m[i+1]
idx := 0
cnt := 0
for times > 0 && idx < len(b) {
if b[idx] != c {
idx++
} else {
cnt++
if idx == len(b)-1 || b[idx] > b[idx+1] {
b = append(b[:idx], b[idx+1:]...)
times--
m[i]--
cnt--
} else if m[i]-cnt < times {
b = append(b[:idx], b[idx+1:]...)
times--
m[i]--
cnt--
} else {
idx++
continue
}
}
}
}
}
}
fmt.Fprintln(out, string(b))
}
// guess xyxz -> xyz not yxz
// badbcdd -> adbcdd
// abbcccb -> abbccc
// 右边的字典序比较大 不删掉
// 右边的字典序一样大 不删掉
// 右边的字典序比较小 删掉
// 假如b有4 m[i]个 需要删掉2 times个 现在已经遍历到了第三 cnt个
// m[i] - cnt < times
Page views: Loading... · Visitors: Loading...
Except where otherwise noted, original content on this site is dedicated to the public domain under CC0 1.0.
Powered by Hexo & Theme mdsuper
沪ICP备2026040813号