蚂蚁笔试 蚂蚁笔试题 0309

笔试时间:2025年03月09 春招实习

历史笔试传送门:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

题目:字符串对照试验

米小游正在进行字符串对照试验,他有一个长度为n的字符串s和另一个长度同样为n的字符串t,他将依次对每一个i = 1,2,...,n进行以下操作:如果s的第i个字符为大写字母,则输出字符串t第i个字符所对应的大写字母形态;如果s的第i个字符为小写字母,则输出字符串t第i个字符所对应的小写字母形态;如果s的第i个字符为数字,则输出字符串t第i个字符所对应的Ascii码;如果s的第i个字符为其他内容,则输出一条下划线"_"。如果你需要 Ascii 码相关的帮助,请参阅下表字符:0-9 --> Ascii:48-57字符:A-Z --> Ascii:65-90字符:a-z --> Ascii:97-122

输入描述

第一行输入一个整数n代表字符串的长度

第二行输入一个长度为n,且由数字,大小写字母、空格及! ? . + - * /这七个常见半角符号构成的字符串s,代表参考串,特别的,保证字符串的首尾不为空格。

第三行输入一个长度为n,且仅由大小写字的构成的子符串t,代表对照串。

输出描述

在一行上输出一个字符串,代表操作过后的字符串。

样例输入

12

Ab01!?. +-*/

aaaAaaaaaaaa

样例输出

Aa9765________

参考题解

模拟即可。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin >> n; 
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    long long res = 0; 
    for (int x : a) {
        res += abs(x);
    }
    cout << res << endl;
    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();
        int[] a = new int[n];
        
        for(int i = 0; i < n; i++){
            a[i] = sc.nextInt();
        }
        
        long res = 0;
        for(int x : a){
            res += Math.abs(x);
        }
        
        System.out.println(res);
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

def solve():
    import sys
    data = sys.stdin.read().strip().split()
    n = int(data[0])
    arr = list(map(int, data[1:1+n]))
    
    res = 0
    for x in arr:
        res += abs(x)
        
    print(res)

# 如果希望直接通过输入运行:
# 在本地或在线环境中可直接写成:
# n = int(input().strip())
# arr = list(map(int, input().strip().split()))
# print(sum(abs(x) for x in arr))

第二题

题目:树上曼哈顿距离

小红有一棵n个结点的二叉树,根结点为1。定义树上一个点的坐标为(xi,yi),根结点的坐标为(0, 0)。一个结点若有两个子结点,那么我们称编号较小的结点为左儿子,编号较大的为右儿子,若只有一个结点,默认其为左儿子。若一个结点的父结点坐标为(a, b),如果该结点为父结点的左儿子,那么此结点的坐标为(a-1, b-1),如果该结点为父结点的右儿子,那么该结点的坐标为(a+1, b-1)。定义两点的树上曼哈顿距离为|x1-x2|+|y1-y2|现在小红会提出若干个询问,每次给出两个点,请你回答两点的树上曼哈顿距离。

输入描述

第一行两个整数 n,q,表示结点个数和询问次数。

接下来n-1行,每行2个整数u,v,表示u,v之间存在一条无向边。

接下来q行,每行两个整数x,y,表示询问的点对。

输入保证是一棵二叉有根树。

输出描述

q行,每行一个整数,两个点的树上曼哈顿距离。

样例输入一

5 2

1 2

2 3

2 4

3 5

1 5

3 1

样例输出一

6

4

参考题解

模拟,按照题意建出树,之后从根节点dfs,过程中维护出每个节点的坐标。后续询问中就可以根据坐标直接计算出曼哈顿距离。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> v;
vector<vector<int>> go;
void dfs(int now, int x, int y, int fa) {
    int f = 1;
    v[now] = {x, y};
    for (int to : go[now]) {
        if (to == fa) continue;
        if (f == 1) dfs(to, x - 1, y - 1, now);
        else dfs(to, x + 1, y - 1, now);
        f = 0;
    }
}
int main() {
    int n, q;
    cin >> n >> q;
    go.resize(n + 1);
    v.resize(n + 1, vector<int>(2));
    for (int i = 0; i < n - 1; i++) {
        int x, y;
        cin >> x >> y;
        go[x].push_back(y);
        go[y].push_back(x);
    }
    for (int i = 1; i <= n; i++) {
        sort(go[i].begin(), go[i].end());
    }
    dfs(1, 0, 0, 0);
    for (int i = 0; i < q; i++) {
        int x, y;
        cin >> x >> y;
        auto&& a = v[x];
        auto&& b = v[y];
        cout << abs(a[0] - b[0]) + abs(a[1] - b[1]) << "\n";
    }
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.*;

public class Main {
    static List<Integer>[] go;    // 存储图的邻接表
    static int[][] v;            // 存储每个节点对应的 (x, y) 坐标

    // 深度优先搜索函数
    static void dfs(int now, int x, int y, int fa) {
        int f = 1;
        v[now][0] = x;
        v[now][1] = y;
        for (int to : go[now]) {
            if (to == fa) {
                continue;
            }
            if (f == 1) {
                dfs(to, x - 1, y - 1, now);
                f = 0;
            } else {
                dfs(to, x + 1, y - 1, now);
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        int q = sc.nextInt();
        
        // 初始化邻接表和坐标数组(1-based)
        go = new ArrayList[n + 1];
        v = new int[n + 1][2];
        for (int i = 0; i <= n; i++) {
            go[i] = new ArrayList<>();
        }

        // 读入边并建立邻接关系
        for (int i = 0; i < n - 1; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            go[x].add(y);
            go[y].add(x);
        }

        // 每个节点的边按升序排序(与原 C++ 代码 sort 效果一致)
        for (int i = 1; i <= n; i++) {
            Collections.sort(go[i]);
        }

        // 从节点 1 开始 DFS,初始坐标 (0, 0),父节点 fa = 0
        dfs(1, 0, 0, 0);

        // 处理 q 次查询
        while (q-- > 0) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            // 曼哈顿距离
            int dist =

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论
已老实
点赞 回复 分享
发布于 04-09 02:53 上海
mark收藏了谢谢
点赞 回复 分享
发布于 04-09 02:53 上海
接好运
点赞 回复 分享
发布于 04-09 02:14 上海
接好运
点赞 回复 分享
发布于 04-08 01:34 上海
mark收藏了谢谢
点赞 回复 分享
发布于 04-07 01:52 上海
笔试时间是春招吗
点赞 回复 分享
发布于 04-06 01:29 上海
接好运
点赞 回复 分享
发布于 03-19 02:29 上海
mark收藏了谢谢
点赞 回复 分享
发布于 03-19 02:22 上海

相关推荐

评论
6
14
分享

创作者周榜

更多
牛客网
牛客企业服务