通知:最新的秋招笔试编程题题目、思路以及参考代码已经全部整理好放在【TechGuide】了,私信公众号回复【美团】或者【字节】即可获得最实时的笔试题解啦!
文章目录
第一道:丁香树(100%)
题目描述
小团每天都会走过一条路去上课。这条路旁种有丁香树,从左向右排成一排并编号为1…n。又是一年一度的丁香季,所有丁香都开花了,第i棵丁香树的芳香值为ai,小团要从第一棵丁香树走到最后一棵。当走到第i棵丁香树时,如果这棵丁香树的芳香值比之前经过的i-1棵丁香树中棵的芳香值高,她的满意度就要加上那x棵丁香树的不同的芳香值个数。
小团知道了这n程丁香树的芳香值,她想知道走过这n棵工香树后自己的满音度是多少。
输入描述
第一行一个正整数n,为丁香树数目:
第二行n个致ai第i个数代表第i棵丁香树的芳香度。对于10%的数据,n<=100;
16
1122233331
输出描述
一行一个整数,表示小团的满意度,
11
提示
当走到第34。5棵丁香树时,因为它们的芳香值为2,大于前两棵丁香树的芳香值1,因为只有一种芳香值,所以经过3、4、5 中的每棵树都会产生1的满意度,总满意度累计为 3;
当走到第67,8,9棵丁香树时,因为它们的芳香值为3,大于前面两种芳香值12,所以经过6,7,8,9中的每棵树都会产生2的满意度,总满意度累计为 8;
综上,一共会产生11点满意度。
参考代码:
Python版本
import sys
n = int(sys.stdin.readline().strip(' ').strip('\n').strip(' '))
arr = list(map(int,sys.stdin.readline().strip(' ').strip('\n').strip(' ').split(' ')))
record = {}
res =0
for i in range(len(arr)):
if arr[i] not in record:
record[arr[i]]=0
record[arr[i]] +=1
for key in record:
if key< arr[i]:
res+= 1
print(res)
# 关注TechGuide! 大厂笔经面经闪电速递!
Go版本
# 排序然后逆序遍历就行了
func main(){
var n int
fmt.Scan(&n)
book := make([]int,n)
for i := range book{
fmt.Scan(&book[i])
}
deck := make([]int,n)
for i := range deck{
fmt.Scan(&deck[i])
}
sort.Ints(book)
sort.Ints(deck)
ans := 1
idx := n - 1
ideck := n - 1
for idx >= 0{
for ideck >= 0 && deck[ideck] >= book[idx]{
ideck--
}
ans = (ans * (n - ideck - 1 - (n - idx - 1))) % (1e9 + 7)
idx--
}
fmt.Println(ans)
}
// 关注TechGuide! 大厂笔经面经闪电速递!
第二道:整理书架(100%)
题目描述
小美在整理她的书。
她有n本书要放,书架上也有n个位面可以放书。每本书都有一个厚度a,可以放书的每个位置都有一个宽度b。小美不想让书折环,因此只有在满足ai<=bi的情况下,第i本书才可以放到第j个位置,否则不可以放。小美想知道有多少种放书的方案。
输入描述
第一行一个整数n,表示有n本书,同时有n个位置。
第二行n个整数,表示每本书的厚度ai
第三行n个整数,表示每个可以放书位置的宽度bi,数据保证所有书可以返回书架
输出描述
输出一行一个整数,表示放书方案的种类数,由于这个方案数很大,话对10^9+7取模后输出。
参考代码
CPP版本
int n;
cin >> n;
vector<ll> a(n);
vector<ll> b(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n; i++) {
cin >> b[i];
}
sort(a.rbegin(), a.rend());
sort(b.begin(), b.end());
ll res = 1;
const int mod = 1e9 + 7;
for (int i = 0; i < n; i++) {
int target = a[i];
auto it = lower_bound(b.begin(), b.end(), target);
if (it == b.end()) {
cout << -1 << endl;
return 0;
}
res *= (n - i) - (it - b.begin());
res %= mod;
}
cout << res << endl;
// 关注TechGuide! 大厂笔经面经闪电速递!
Python版本
import sys
from bisect import bisect_right,bisect_left
n = int(sys.stdin.readline().strip(' ').strip('\n').strip(' '))
arra = list(map(int,sys.stdin.readline().strip(' ').strip('\n').strip(' ').split(' ')))
arrb = list(map(int,sys.stdin.readline().strip(' ').strip('\n').strip(' ').split(' ')))
arra = sorted(arra,reverse=True)
arrb = sorted(arrb)
mode = int(1e9+7)
res = 1
for i in range(n):
flag = arra[i]
idx = bisect_left(arrb,flag)
tres = n-idx -i
if tres<=0:
res = 0
break
res = (res*tres)%mode
print(res)
# 关注TechGuide! 大厂笔经面经闪电速递!
第三道:文件流(100%)
题目描述
小团最近在学习操作系统。
文件流是操作系统中一个重要的概念。在Linux操作系统中,/dev/random和/dev/urandom是两个重要的设备,它们可以提供永不为空的随机宇节数据流。在这里,流是不能回退的。
小团自己也实现了一个类似于/dev/random的设备/dev/crandom,但是它只能提供预先设定好但循环不断的某个由随机小写字母组成的字符出。比如这个随机宇符串为 meitun,那么这个设备会提供永不为空的宇符串流meinammeitanmeit…
小团想利用这个设备生成一段由小写英文字母组成的文宇,但她想知道恰好生成完这段文字时,浪费了这个流的多少个字符。
输入描述
第一行一个长为n的字符串s,表示这个循环出现的随机字符串。
第二行一个长为m的字符串a,表示小团相要生成的宇符串。
对于另外20%的数据,保证s中ASCII码大的字母均出现在AscII码小的字母之后
保证字符串s与a只包含小写英文字母
输出描述
输出一行一个整数,如果不能生成字符串a,则输出-1,否则输出恰好生成完这个字符串时,浪费了这个流的多少个字符。
思路
参考代码
import sys
s = sys.stdin.readline().strip(' ').strip('\n').strip(' ')
a = sys.stdin.readline().strip(' ').strip('\n').strip(' ')
records = []
record = {}
for i in range(len(s)-1,-1,-1):
record[s[i]] = i
records.append(record.copy())
records = records[::-1]
flag = False
for c in a:
if c not in record:
flag= True
break
if flag:
print(-1)
else:
res = 0
n = len(s)
idx = 0
i= 0
while i<len(a):
c = a[i]
if idx>=n :
idx = 0
continue
trecord = records[idx]
if c not in trecord:
res += (n- idx)
idx = 0
continue
next_idx = trecord[c]
res += (next_idx-idx)
idx = next_idx+1
i+=1
print(res)
# 关注TechGuide! 大厂笔经面经闪电速递!
第四道:收割(100%)
题目描述
小美老家有地,这些地块形成了一个树形结构,有n块地由n-1条可双向通行的道路连接,使得这n块地连通,这n块地编号为1到n小美总位于1号地块。
现在小美要收割地里的收成,她有一台性能很强的收割机,可以沿着道路连续收割地块。但是正因为性能很强,所以收割速度太快,就导致工作时不能转向。也就是说,小美只能从1号地块出发,沿某条路径收割,直到一个叶子节点停止。
但是有些地块里有大石头,可能会导致收割机损坏。如果连续经过了大于m块有石头的地块,收割机就会损坏。所以小美想知道,有多少条从1号地块出发,到达某个叶子节点的路径能够使得收割过后她的收割机不损坏。
输入描述
第一行两个整数n,m,意义如题目描述。
第二行n个整数pi,p如果是0,则代表i号地块没有石头,如果是1,则代表有石头。
第三行n-1个整数fi,表示(i+1,f)之间有一条可双向通行的道路相连。
参考代码:
CPP版本(36%)
#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
#include <queue>
using namespace std;
const int maxn = 1005,maxm = 1005;
int book[maxn][maxm];
int main() {
int n,m,k,res=0;
cin>>n>>m>>k;
int x,y,r;
for (int i = 1; i <n+1 ; ++i) {
for (int j = 1; j <m+1 ; ++j) {
book[i][j] =1;
}
}
// vector<vector<int> >book(n+1, vector<int>(m+1,1));
for (int tt = 0; tt < k; ++tt) {
cin>>x>>y>>r;
for (int i = 1; i <n+1 ; ++i) {
for (int j = 1; j <m+1 ; ++j) {
if ((i-x)*(i-x)+(j-y)*(j-y)<= r*r){
book[i][j] =0;
}
}
}
if (tt!=k-1){
for (int i = 1; i <n+1 ; ++i) {
for (int j = 1; j <m+1 ; ++j) {
book[i][j] +=1;
}
}
}
}
for (int i = 1; i <n+1 ; ++i) {
for (int j = 1; j <m+1 ; ++j) {
res+=book[i][j];
}
}
cout<<res;
return 0;
}
// 关注TechGuide! 大厂笔经面经闪电速递!
恭喜发现宝藏!微信搜索公众号【TechGuide】关注更多新鲜好文和互联网大厂的笔经面经。