饿了么笔试 饿了么笔试题 0307
笔试时间:2025年03月07 春招实习
历史笔试传送门:2023秋招笔试合集
第一题
题目:小红的字符串
小红拿到了一个01串s。
她将进行恰好一次以下操 作:选择下标i,j(i≠j),交换si和sj。
小红想知道,不同的操作方案,最终能生成多少不 同的字符串?
输入描述
一个仅由'0'和"1'构成的字符串。字符串长度不小于2,不大于200000。
输出描述
一个整数,代表最终的方案数。
样例输入
1100
样例输出
5
说明:
共有以下5种不同字符串:
交换第一个和第二个字符,形成1100
交换第二个和第三个字符,形成1010
交换第二个和第四个字符,形成1001
交换第一个和第三个字符,形成0110
交换第一个和第四个字符,形成0101
参考题解
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
getline(cin, s);
long long cnt_0 = 0, cnt_1 = 0, ans = 1;
for (char c : s) {
if (c == '0') {
ans += cnt_1;
cnt_0++;
} else {
ans += cnt_0;
cnt_1++;
}
}
cout << ans << endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
long cnt_0 = 0, cnt_1 = 0, ans = 1;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '0') {
ans += cnt_1;
cnt_0++;
} else {
ans += cnt_0;
cnt_1++;
}
}
System.out.println(ans);
sc.close();
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
import sys s = input() cnt_0 = 0 cnt_1 = 0 ans = 1 for i,c in enumerate(s): if c == '0': ans += cnt_1 cnt_0 += 1 else: ans += cnt_0 cnt_1 += 1 print(ans)
第二题
题目:小红的验证码
小红是一个程序员,他正在开发一个验证码功能。
为了正确识别机器人和真实用户,小红需要对验证码进行特殊处理。
他想出来了如下加密法:图像+数字识别法,在一张5x5图片中放入一个数字,例如:
#222#
#2###
#232#
###2#
#272#
这张图片机器人会识别数字 22222322272,但是正确的识别码为 5。 给出所有的数字摆放形态:
系统将会在?处随机填入[0,9]的数字,然后给出m个图片,为 pitcurei(1<=i<=m),你需要按照1~m的顺序输出这 m 个数字以正确识别小红的系统。
输入描述
第一行一个整数 m(1<m<1000),表示图片个数。接下来共 m*5行,每行5列,表示给定的图片。输入保证仅含 [0,9] 和 #。
输出描述
一个整数,表示图片所所表示的正确验证码。
样例输入一
1
#222#
#2###
#232#
###2#
#272#
样例输出一
5
样例输入二
2
#222#
#2###
#232#
###2#
#272#
##1##
##1##
##1##
##1##
##1##
样例输出二
51
参考题解
将所有输入的矩阵中的数字字符进行统一处理,接着预处理出所有的数字对应的矩阵比对。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <string>
#include <cctype>
using namespace std;
int main(){
int n;
cin >> n;
cin.ignore(); // 清除换行符
// 定义样本数组 s0
vector<vector<string>> s0 = {
{"#000#","#0#0#","#0#0#","#0#0#","#000#"},
{"##0##","##0##","##0##","##0##","##0##"},
{"#000#","###0#","#000#","#0###","#000#"},
{"#000#","###0#","#000#","###0#","#000#"},
{"#0#0#","#0#0#","#000#","###0#","###0#"},
{"#000#","#0###","#000#","###0#","#000#"},
{"#000#","#0###","#000#","#0#0#","#000#"},
{"#000#","###0#","###0#","###0#","###0#"},
{"#000#","#0#0#","#000#","#0#0#","#000#"},
{"#000#","#0#0#","#000#","###0#","#000#"}
};
string res = "";
for (int i = 0; i < n; i++){
vector<string> matrix(5);
// 读入5行
for (int j = 0; j < 5; j++){
getline(cin, matrix[j]);
}
// 扫描并将数字字符替换为 '0'
for (int row = 0; row < 5; row++){
for (int col = 0; col < 5; col++){
if (isdigit(matrix[row][col])){
matrix[row][col] = '0';
}
}
}
// 将 matrix 与 s0 中的每个模式比对
for (int j = 0; j < 10; j++){
if (matrix == s0[j]){
res += char('0' + j);
break; // 假设每个矩阵只匹配一个模式
}
}
}
cout << res;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine(); // 消耗换行符
// 定义样本数组 s0
String[][] s0 = {
{"#000#","#0#0#","#0#0#","#0#0#","#000#"},
{"##0##","##0##","##0##","##0##","##0##"},
{"#000#","###0#","#000#","#0###","#000#"},
{"#000#","###0#","#000#","###0#","#000#"},
{"#0#0#","#0#0#","#000#","###0#","###0#"},
{"#000#","#0###","#000#","###0#","#000#"},
{"#000#","#0###","#000#","#0#0#","#000#"},
{"#000#","###0#","###0#","###0#","###0#"},
{"#000#","#0#0#","#000#","#0#0#","#000#"},
{"#000#","#0#0#","#000#","###0#","#000#"}
};
StringBuilder res = new StringBuilder();
for (int i = 0; i < n; i++) {
String[] matrix = new String[5];
// 读入5行
for (int j = 0; j < 5; j++) {
matrix[j] = sc.nextLine();
}
// 扫描并将数字字符替换为 '0'
for (int row = 0; row < 5; row++) {
StringBuilder sb = new StringBuilder(matrix[row]);
for (int col = 0; col < 5; col++) {
if (Character.isDigit(sb.charAt(col))) {
sb.setCharAt(col, '0');
}
}
matrix[row] = sb.toString();
}
// 将 matrix 与 s0 中的每个模式比对
for (int j = 0; j < 10; j++
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。
