蚂蚁笔试 蚂蚁笔试题 0316
笔试时间:2025年03月16日
历史笔试传送门:
第一题
题目:书写字符串
小红有一个由小写字母组成的字符串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打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南