饿了么笔试 饿了么笔试题 0321
笔试时间:2025年03月21日
历史笔试传送门:
第一题
题目
对于给定的 n 个整数构成的数组,检查有多少个长度为3的连续子数组b1,b2,b3满足:b1>=b2, b2<=b3。更形象地说,这样的子数组形如'V’状。
输入描述
第一行输入n,表示数组中的元素数量
接下来输入n各整数代表数组元素
输出描述
输出一个整数,代表满足条件的连续子数组数量
样例输入
5
5 1 4 2 3
样例输出
2
参考题解
数组里直接判断即可
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int count = 0;
for (int i = 0; i < n - 2; i++) {
if (a[i] >= a[i + 1] && a[i + 1] <= a[i + 2]) {
count++;
}
}
cout << count << endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
package leetcode;
import java.util.Scanner;
public class nums_v {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
int count = 0;
for (int i = 0; i < n-3; i++) {
if (a[i] >= a[i+1] && a[i+1] <= a[i+2]){
count++;
}
}
System.out.println(count);
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
n = int(input())
a = list(map(int, input().split()))
count = 0
for i in range(n - 2):
if a[i] >= a[i + 1] and a[i + 1] <= a[i + 2]:
count += 1
print(count)
第二题
题目
对于给定的长度为 n,仅由小写字母组成的字符串...sn如果有这样的两个不同的位置i和 j,满足i和 j,奇偶性相同且其上的字符 si和 sj;在字母表中相差的位置数小于等于 g,那么我们称i和 j是“有缘分的”。你需要求解,对于给定的 g,字符串s中,有多少对位置是“有缘分的”。字母表的第 1个字母为'a’,第 26 个字母为'z’。两个字符在字母表中的位置差,即为它们在字母表中相隔的字母个数。例如,'a’与'd’之间隔了'b’和'c’两个字母,所以位置差为 2。
输入描述
第一行输入两个整数n, g代表字符串的长度、约束
第二行输入一个长度为n,仅由小写字母组成的字符串s
输出描述
输出一个整数,代表满足条件的"有缘分的"位置对数
样例输入一
3 25
aaa
样例输出一
1
样例输入二
4 1
acbd
样例输出二
2
参考题解
1.分别统计奇数位置和偶数位置的字符频率。2.对每个分组(奇数和偶数),遍历每个字符 c 的频率。对于每个字母,计算其自身组成的字符对数量。如果某个字母出现了 m 次,那么它自身组成的字符对数量为 m * (m - 1) / 2。对于不同的字母对,检查它们在字母表中的位置差的绝对值是否小于等于 g。如果满足条件,则将它们出现次数的乘积累加到结果中。3.最后把奇数分组和偶数分组的结果相加。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
using namespace std;
long long calculate(const vector<int>& count, int g) {
long long sum = 0;
for (int i = 0; i < 26; ++i) {
sum += (long long)count[i] * (count[i] - 1) / 2;
for (int j = i + 1; j < 26; ++j) {
if (abs(i - j) <= g) {
sum += (long long)count[i] * count[j];
}
}
}
return sum;
}
int main() {
int n, g;
cin >> n >> g;
string s;
cin >> s;
vector<int> countOdd(26, 0);
vector<int> countEven(26, 0);
for (int i = 0; i < n; ++i) {
char c = s[i];
if ((i + 1) % 2 == 1) {
countOdd[c - 'a']++;
} else {
countEven[c - 'a']++;
}
}
long long res = 0;
res += calculate(countOdd, g);
res += calculate(countEven, g);
cout << res << endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import lava.util.scanner;
public class Main {
public static void main(Stringll args){
Scanner
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南


