蚂蚁笔试 蚂蚁笔试题 0410

笔试时间:2025年04月10日

历史笔试传送门:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

题目

现在小红给定一个长度为 n,仅由字符'N’和'Z’构成的字符串,请你帮助小红计算至少需要旋转多少次才可以使得字符串变得只包含一个字母类型。

输入描述

第一行一个整数n(1 <= n <=10^5),表示字符串的长度。第二行一个长度为 n,仅由字符'N’和'Z’构成的字符串。

输出描述

一个整数,表示小红至少需要旋转多少次才可以使得字符串变得只包含一个字母类型。

样例输入

3

ZNN

样例输出

1

模拟,输出N 或 Z 个数小的

参考题解

统计字符串中连续相同字符的分段数量,分别统计‘N’和‘Z’各自出现的分段数。 将两者较小的值作为旋转次数,即可达到全字符串统一字符的要求。

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

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    string s;
    cin >> s;

    int cc = 0;
    for (char c : s) {
        if (c == 'N') {
            cc++;
        }
    }
    cout << min(cc, n - cc) << "\n";
    return 0;
}

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

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());
        String s = br.readLine().trim();

        int cc = 0;
        for (int i = 0; i < n; i++) {
            if (s.charAt(i) == 'N') {
                cc++;
            }
        }
        System.out.println(Math.min(cc, n - cc));
    }
}

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

n = int(input())
s = input()
cc = 0
for c in  s:
    if c == 'N':
        cc += 1;
print(min(cc, n - cc))

第二题

题目

给定两个长度为n 的数组a和b,你可以对这两个数组进行重排,得到数组aa和bb。定义ci(1≤i≤n)为: ci=aai-bbi 当i为奇数 *G=bbi-aai 当i为偶数 要求计算 c1 +c2 +c3 +...+cn 的最大值。

输入描述

第一行包含一个整数n,表示数组的长度,满足1≤n≤10^5第二行包含n 个整数,表示数组a,其中1 <=ai<=10^9第三行包含n 个整数,表示数组b,其中1 <=bi<=10^9

输出描述

输出一个整数,表示c1+ c2 +c3 十...十 cn 的最大值

样例输入

3

1 2 3

3 2 1

样例输出

4

在这个例子中,可以对数组进行如下重新排列:

aa= [3,1,2]

bb= [2,3,1]

计算得到:

c1=3-2=1

c2=3-1=2

c3=2-1=1

因此,c1+c2+c3=1+2+1=4.

参考题解

将数组 a 和 b 分别排序后,根据奇偶位置的数量(oddCount 与 evenCount)确定从 a 中取大值、从 b 中取小值的位置,以最大化奇数位置差和偶数位置差。计算 a 的后 oddCount 个数和前 evenCount 个数的和,以及 b 的前 oddCount 个数和后 evenCount 个数的和,最终结果为 (a1 - b1) + (b2 - a2)。对于 a 数组,在奇数位置要求取较大的数,因此选择排序后的最后 oddCount 个元素,计算它们的和,记为 a1。对于 b 数组,在奇数位置要求取较小的数,因此选择排序后的前 oddCount 个元素,计算它们的和,记为 b1。所有奇数位置,贡献的差值总和为 a1 - b1。对于 b 数组,在偶数位置要求取较大的数,因此选择排序后的最后 evenCount 个元素,计算它们的和,记为 b2。对于 a 数组,在偶数位置要求取较小的数,因此选择排序后的前 evenCount 个元素,计算它们的和,记为 a2。这样,对于所有偶数位置,贡献的差值总和为 b2 - a2。

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

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<int> a(n), b(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> b[i];
    }

    sort(a.begin(), a.end());
    sort(b.begin(), b.end());

    int oddCount = (n + 1) / 2;
    int evenCount = n / 2;

    long long a1 = 0;
    for (int i = n - oddCount; i < n; i++) {
        a1 += a[i];
    }

    long long b1 = 0;
    for (int i = 0; i < oddCount; i++) {
        b1 += b[i];
    }

    long long b2 = 0;
    for (int i = n - evenCount; i < n; i++) {
        b2 += b[i];
    }

    long long a2 = 0;
    for (int i = 0; i < evenCount; i++) {
        a2 += a[i];
    }

    cout << ( (a1 - b1) + (b2 - a2) ) << "\n";
    return 0;
}

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

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());

        int[] a = new int[n];
        int[] b = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            a[i] = Integer.parseInt(st.nextToken());
        }
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            b[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(a);
        Arrays.sort(b);

        int oddCount = (n + 1) / 2;
        int evenCount = n / 2;

        long a1 = 0;
        for (int i = n - oddCount; i < n; i++) {
            a1 += a[i];
        }

        long b1 = 0;
        for (int i = 0; i < oddCount; i++) {
            b1 += b[i];
        }

        long b2 = 0;
        for (int i = n - evenCount; i < n; i++) {
            b2 += b[i];
        }

        long a2 = 0;
        for (int i = 0; i <

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

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

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

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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