饿了么笔试 饿了么笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论
第一题零和一个数相乘加一就是答案,第二题将二维码转成一串字符串,用hashmap存
1 回复 分享
发布于 03-11 20:57 湖南
mark一下
点赞 回复 分享
发布于 04-07 01:49 上海
请问前端也考的这个吗?
点赞 回复 分享
发布于 03-08 00:24 湖南

相关推荐

双非想上岸:上周六面的一面,现在有收到二面相关消息的友友吗
投递深信服等公司7个岗位 深信服求职进展汇总
点赞 评论 收藏
分享
评论
4
36
分享

创作者周榜

更多
牛客网
牛客企业服务