蚂蚁笔试 蚂蚁笔试题 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 上海

相关推荐

07-03 16:13
嘉应学院 Python
xiaolihuam...:很明显骗子,如果是hr直接约你面试了,哪用得着内推,如果是员工的话,你得多优秀,一线员工直接加你微信,
点赞 评论 收藏
分享
Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
08-15 18:44
门头沟学院 Java
点赞 评论 收藏
分享
评论
6
14
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务