饿了么笔试 饿了么笔试题 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多种语言版本,持续更新中。