蚂蚁笔试 蚂蚁笔试题 0309
笔试时间:2025年03月09 春招实习
历史笔试传送门:
第一题
题目:字符串对照试验
米小游正在进行字符串对照试验,他有一个长度为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打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南
