Eagle233-Blog

[Interview] 小红书28届实习 Product Engineer-产品工程师(Al全栈or应用研发方向)笔试测评


Categories Interview
Tags

2.2k Words   |   9 Minutes

说明

  • 测评平台:赛码网
  • 简历在官网通过初筛之后会收到测评邮件,可以选择三场任意一场测评参加,我选择的是最后一场
    考试信息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. 连续正整数的乘积(魔法数字)

题目描述

定义一个正整数 xx 为「魔法数字」,当且仅当它可以表示成至少三个连续正整数的乘积。
即存在两个正整数 l,rl,r,满足:

r−l+1≥3r-l+1\ge3

且

x=∏i=lrix=\prod_{i=l}^{r}i

给定 TT 个正整数,请判断每个整数是否为魔法数字。

输入描述

第一行输入一个正整数 TT,表示询问次数。
接下来 TT 行,每行输入一个正整数 xx。
参考历史题面,1≤x≤1091\le x\le10^9。

输出描述

对于每次询问,如果是魔法数字,输出 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 字符串的连续删除

题目描述

给定一个长度为 nn 的字符串 ss,仅由字符 0 和 1 组成。
每轮执行以下操作:

  1. 对于每一个字符,寻找其右侧第一个与自身不同的字符。如果存在,则标记该字符。
  2. 本轮所有标记同时进行,同一个位置即使被多次标记,也只计一次。
  3. 删除所有被标记的字符,剩余字符按原顺序拼接成新的字符串。

重复执行以上操作,直到没有任何字符被标记。
请计算整个过程中总共删除了多少个字符。
等价地,每一轮删除所有相邻不同字符对中的右侧字符,注意必须先统一标记,再同时删除。

输入描述

第一行输入正整数 nn,表示字符串长度。
第二行输入长度为 nn 的字符串 ss,保证仅包含 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. 字典序最小的频率非降字符串

题目描述

给定一个长度为 nn 的字符串 ss,仅由小写英文字母组成。
你可以删除字符串中的任意若干字符,但不能改变剩余字符的相对顺序。
要求删除后得到的字符串 tt 满足:

cntt(a)≤cntt(b)≤cntt(c)≤⋯≤cntt(z)cnt_t(a)\le cnt_t(b)\le cnt_t(c) \le\cdots\le cnt_t(z)

其中 cntt(c)cnt_t(c) 表示字母 cc 在字符串 tt 中的出现次数。
需要满足以下两个优化目标,优先级从高到低:

  1. 删除的字符数量尽可能少。
  2. 在删除次数最少的所有合法方案中,选择字典序最小的结果字符串。

输出最终得到的字符串。
特别注意:未出现的字母出现次数视为 0,也参与上述比较。

输入描述

第一行输入一个正整数 nn,表示字符串长度。
第二行输入一个长度为 nn 的字符串 ss。
数据范围:

  • 1≤n≤2×1051\le n\le 2\times10^5
  • ss 仅包含小写英文字母
  • 保证 ss 中至少出现一个 z

输出描述

输出一行字符串,表示删除次数最少且字典序最小的合法结果。

样例 1

输入

4
xyxz

输出

xyz

原始频次:

cnt(x)=2,cnt(y)=1,cnt(z)=1cnt(x)=2,\quad cnt(y)=1,\quad cnt(z)=1

至少要删除一个 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号
Search