2022届 美团数据开发秋招笔试记录

前言

2021年9月:还没学数据结构算法,帮同学做题顺便做点记录

1. ab串

1.1 题目

时间限制:3000MS
内存限制:589824KB
题目描述
  小美数学很好,小团数学不怎么好。有一天小美又在用数学题欺负小团,她提出了这样一个问题:“有多少个长度为n的仅有a和b组成的字符串既不包含aba也不包含bab?如果你算不来大数你可以告诉我这个问题的答案模上998244353是多少”小团实在忍不住了,所以他决定找你帮忙。

输入描述
  第一行有一个整数n(1<=n<=100000),代表小美问题中的参数。
输出描述
  输出一个整数,即小美所问问题的答案除以998244353所得余数。

样例输入:3
样例输出:6

1.2 解

解题思路
在这里插入图片描述
  找规律,因为左右分支对称只画一半,先从最基础的看ab,可以发现规律:1长出2,2长出1和2。当时以此为基础直接写了个递归代码: [ 1 ] → [ 2 ] → [ 1 , 2 ] → [ 2 , 1 , 2 ] [1]\to[2]\to[1,2]\to[2,1,2] [1][2][1,2][2,1,2],然后对列表求和,明显空间复杂度太高。
  进一步找规律,发现从 n = 3 n=3 n=3 开始,上一轮如果是 i × 2 + j × ( 1 + 2 ) i\times2 + j\times(1+2) i×2+j×(1+2),按照2长出1+2,1长出2的规律,下一轮就是 j × 2 + ( i + j ) × ( 1 + 2 ) j\times2 + (i+j)\times(1+2) j×2+(i+j)×(1+2),也就是构成斐波那契数列。
代码思路
  
代码

def fun(n, k=[0, 1]):
    if n == 1:
        return 2
    if n == 2:
        return 4
    else:
        if n > 3:
            k = [k[1], sum(k)]
            return fun(n-1, k)
        else:
            return 2*(2*k[0] + 3*k[1]) % 998244353
        
fun(100)

结果:只来得及提交递归列表的,20%+,这个代码也没法ac,没做对大数处理


2. 坐公交

2.1 题目

时间限制:3000MS
内存限制:589824KB
题目描述
  小美想坐公交去找小团玩。美团市中共有n个公交站,编号为1到n。同时也有m条公交线路,编号为1到m,小美想知道对于每一对公交站(i, j)从编号为i的站坐公交到编号为j的站至少需要乘坐几条不同的公交线路。

输入描述
  第一行有两个空格隔开的整数n,m(1<=n<=500,1<=m<=500且1<=n+m<=500),代表公交站的个数和公交线路的条数。
  接下来n行,每一行开头有一个整数k(1<=k<=m),代表从这个站可以乘坐k条不同的公交线路。接下来有k个整数,代表这k条公交线路的编号。数字间用空格隔开。
输出描述
  输出个nxn的矩阵,矩阵中第i行第j列的数代表从编号为i的站坐到编号为j的站至少需要乘坐多少条不同的公交线路。矩阵中每行中的元素由单个空格隔开,且行末不能有空格

样例输入
3 2
1 1
2 1 2
1 2
样例输出
0 1 2
1 0 1
2 1 0

2.2 解


3. 不许ac

3.1 题目

时间限制:5000MS
内存限制:589824KB
题目描述
  小美天天刷题,收获了很多ac为了纪念这些ac,小美记下了个长度为n的仅有a和c组成的字符串。小团天天摸鱼不刷题,所以ac没有小美多。小团决定在小美睡觉的时候把小美字符串中的ac通过交换相邻两个字符全部消除。即通过一系列交换相邻字符的操作使得操作后的串中不存在ac这个字串。小团想知道他至少要交换多少次才能达成他的目的。

输入描述
  第一行有一个整数n(1<=n<=100000),代表小美拥有的字符串长度。
  第二行有一个仅由a和c组成的字符串,代表小美的字符串。
输出描述
  输出一个整数,代表小团想知道的答案。
  如样例中先交换前两个字符再交换中间两个字符即可使小美的字符串变成ccaa。

样例输入
4
acca
样例输出
2

3.2 解

解题思路
  因为不能有ac,所以所有的a要在右边,所有的c在左边;交换方式只能相邻交换,所以交换方法就是从右往左把每个a换到最右边,交换次数就是这个a右边有多少c。
代码思路
  从右往左,记录每个a右边有几个c,然后求和。
代码

def fun(s, n):
    c = 0
    count = []
    for i in s[::-1]:
        if i == 'c':
            c += 1
        elif i == 'a':
            count.append(c)
    return sum(count)

s = 'acca'
n = len(s)
fun(s, n)

结果:100%


4. 四边形

4.1 题目

时间限制:3000MS
内存限制:589824KB
题目描述:小美有一张无向图。特别会数数的小团想拿个难题考一下小美,于是他决定询问小美这张无向图中有多少个不同的四边形。无向图中的四边形由四个不同的点a,b,c,d和四条属于这张无向图的边(a,b),(b,c),(c,d),(d,a)组成。若两个四边形的点集和边集相同,则我们认为这两个四边形是同一个四边形。小美的这张无向图有点大,她希望你帮她算出这个难题的答案。

输入描述
第一行有一个整数n代本这张无向图中的点数。
接下来n行给出这张无向图的邻接矩阵,每行有n个由空格隔开的整数,每个整数的值为0或1
输入保证对角元为0,即这张图没有自环。
输出描述
输出一个整数,代表这张无向图中有多少个不同的四边形。

样例输入
6
0 1 1 1 0 0
1 0 1 0 1 0
1 1 0 0 0 1
1 0 0 0 1 1
0 1 0 1 0 1
0 0 1 1 1 0
样例输出
3

猜你喜欢

转载自blog.csdn.net/weixin_43605641/article/details/120112614