蚂蚁金服笔试 蚂蚁金服笔试题 0511
笔试时间:2024年05月11日
历史笔试传送门:2023秋招笔试合集
第一题
题目:小红的元素取反
小红定义一个数组的权值为:正数的元素数量减去负数的元素数量。例如,[1,2,-3,-4,5]的权值是1,[-2,-5]的权值是-2。现在小红拿到了一个数组,她准备选择恰好k个元素进行取反(同一个元素最多只能取反一次),之后使得数组的权值尽可能大。你能帮帮她吗?
输入描述
第一行输入两个正整数n,k,代表小红拿到的数组和选择的元素数量。
第二行输入n个整数ai,用空格隔开。代表小红拿到的数组。1<=k<=n<=10^5 -10^9<=ai<=10^9。
输出描述
一个整数,代表操作后数组权值的最大值。
样例输入
5 3
-5 1 4 -2 3
样例输出
3
说明
选择第1、3、4个元素取反,数组变成[5,1,-4,2,3],权值为3。
参考题解
让正数尽可能的多。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <vector> using namespace std; int main() { int n, k; cin >> n >> k; vector<int> nums(n); for (int i = 0; i < n; ++i) { cin >> nums[i]; } // 统计大于0的数的个数 int cnt1 = 0, cnt2 = 0, zero = 0; for (int i = 0; i < n; ++i) { if (nums[i] > 0) cnt1++; else if (nums[i] < 0) cnt2++; else zero++; } if (k <= cnt2) { cout << cnt1 - cnt2 + 2 * k << endl; } else { if (zero + cnt2 >= k) { cout << cnt1 + cnt2 << endl; } else { cout << cnt1 + cnt2 - 2 * (k - zero - cnt2) << 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 k = sc.nextInt(); int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = sc.nextInt(); } // 统计大于0的数的个数 int cnt1 = 0, cnt2 = 0, zero = 0; for (int i = 0; i < n; i++) { if (nums[i] > 0) cnt1++; else if (nums[i] < 0) cnt2++; else zero++; } if (k <= cnt2) { System.out.println(cnt1 - cnt2 + 2 * k); } else { if (zero + cnt2 >= k) { System.out.println(cnt1 + cnt2); } else { System.out.println(cnt1 + cnt2 - 2 * (k - zero - cnt2)); } } sc.close(); } }
Python:[此代码未进行大量数据的测试,仅供参考]
n,k = map(int,input().split()) nums = list(map(int,input().split())) # 统计大于0的数的个数 cnt1 = sum([1 for i in nums if i > 0]) cnt2 = sum([1 for i in nums if i < 0]) zero = n - cnt1 - cnt2 if k <= cnt2 : print(cnt1 - cnt2 + 2*k) else: if zero + cnt2 >= k: print(cnt1 + cnt2) else: print(cnt1 + cnt2 - 2*(k - zero - cnt2))
第二题
题目:小红的等腰梯形
小红在平面上拿到了四个点,请你判断这四个点是否构成等腰梯形。定义等腰梯形为:四条边分为两对,有一对边平行且不相等,另一对边相等且不平行。
输入描述
第一行输入一个整数q,代表询问次数。
接下来的q行,每行输入8个整数p1x,p1y,p2x,p2y,p3x,p3y,p4x,p4y,代表询问的四个点的坐标。
1<=q<=1000,-1000<=pix,piy<=1000。
输出描述
输出q行。如果询问的答案是等腰梯形,则输出"Yes"。否则输出"No"。
样例输入
3
0 0 2 4 5 0 3 4
0 0 1 4 2 0 3 4
0 1 2 1 3 2 3 4
样例输出
Yes
No
Yes
参考题解
满足以下2个条件:
有且只存在两条边平行
侧边相等。可构成等腰梯形。按照以上条件枚举4个点的所有可能即可。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <cmath> using namespace std; // 判断两条边是否平行 bool jdg(pair<int, int> p1, pair<int, int> p2, pair<int,
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。