蚂蚁笔试 蚂蚁笔试题 0316

笔试时间:2025年03月16日

历史笔试传送门:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

题目:书写字符串

小红有一个由小写字母组成的字符串s和一个整数p,他将字符串反复的拼接,即得到s+s+...,随后按照以下方式书写这个字符串:书写接下来的 1 个字母,换行;书写接下来的 2 个字母,换行;......书写接下来的 i 个字母,换行;书写接下来的 i+1 个字母,换行;一直书写到满p行为止。直接输出将每一行行首字母从上到下依次连接得到的字符串。

输入描述

第一行输入一个仅由小写字母组成的字符串s,长度为1 ≦|s|≤ 10^5。第二行输入一个整数p(1 ≦ p ≦ 10^5),代表书写的行数

输出描述

在一行上输出一个字符串代表答案

样例输入

helloworld

6

样例输出

helohw

书写过程:

第一行: h (取1个字母)

第二行: el (取2个字母)

第三行: low (取3个字母)

第四行: orld (取4个字母)

第五行: hello (取5个字母)

第六行: worldh (取6个字母)

每行的首字母依次为:h、e、l、o、h、w。

参考题解

模拟

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

#include <bits/stdc++.h>
using namespace std;
int main() {
    string s;
    int k;
    cin >> s >> k; 
    string res;    
    int step = 1;  
    int i = 0, j = 0;
    int n = s.length(); 
    while (j < k) {
        res += s[i];
        i += step;  
        i %= n; 
        step += 1; 
        j += 1; 
    }
    cout << res << endl;
    return 0;
}

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

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        int k = scanner.nextInt();

        StringBuilder res = new StringBuilder();
        int step = 1;
        int i = 0, j = 0;
        int n = s.length();

        while (j < k) {
            res.append(s.charAt(i));
            i += step;
            i %= n;
            step++;
            j++;
        }
        System.out.println(res.toString());
    }
}

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

s, k = input().split()
k = int(k)
res = []
step = 1
i = 0
j = 0
n = len(s)

while j < k:
    res.append(s[i])
    i += step
    i %= n
    step += 1
    j += 1

print(''.join(res))

第二题

题目:剩余字符的最大价值

对于长度为 n 、仅由 0 和 1 构成的字符串s,第 i 个位置有一个价值 ai,现在,你需要从字符串s中剧除一些字符,使得满足:删除后的字符串中不存在连续的三个字符恰好为110。显然,有非常多的删除方式,我们的问题是,剩余字符的最大价值之和为多少。

输入描述

第一行输入一个整数n,(1 <= n <=2 x10^5)代表字符串长度。

第二行输入 n 个数a1,a2,a3...an(1<= ai <= 10^9)代表每一个位置的价值。

第三行输入一个长度为 n 、仅由 0 和 1 构成的字符串s。

输出描述

在一行上输出一个整数,代表删除后剩余字符的最大价值。

样例输入一

4

4 3 2 1

1100

样例输出一

7

样例输入二

5

1 1 1 1 1

00000

样例输出二

5

在这个样例中,不需要进行删除操作

参考题解

dp,保证组成的最后字符串中不包含110,那么其实只需要记录当前已经组成的字符串最后的三种状态,分别是0,1,11 对于枚举的新字符如果为0,则可以由状态0->0 / 1->0, 但是如果前面的状态为11则不能转移,因为会组成110与题目要求不符 对于枚举的新字符如果为1,则可以由状态0->1 / 1->11 / 11->11 这三种状态转移 按照上述分析进行转移即可

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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    int n;
    cin >> n;
    vector<ll> arr(n);
    for (int i = 0; i < n; i++) cin >> arr[i];
    vector<vector<ll>> f(n, vector<long long>(3, -1));
    string s;
    cin >> s;
    if (s[0] == '0') f[0][0] = arr[0];
    else if (s[0] == '1') f[0][1] = arr[0];
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < 3; j++) f[i][j] = f[i - 1][j];
        if (s[i] == '0') {
            f[i][0] = max(f[i][0], arr[i]);
            if (f[i - 1][0] != -1 || f[i - 1][1] != -1) {
                f[i][0] = max(f[i][0], max(f[i - 1][0], f[i - 1][1]) + arr[i]);
            }
        } else {
            f[i][1] = max(f[i][1], arr[i]);
            if (f[i - 1][0] != -1) {
                f[i][1] = max(f[i - 1][0] + arr[i], f[i][1]);
            }
            if (f[i - 1][1] != 

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

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

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

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务