蚂蚁金服笔试 蚂蚁金服笔试题 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%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

爱贝生的奖金制度旨在激励每一个参与者,不仅是为了个人的收益,更是为了团队的发展和壮大。这一制度涵盖了五个核心板块,每个板块都有其独特的魅力和价值。一、直推奖。这是爱贝生最基础的奖励机制,门槛极低,只需3960元即可成为创客。作为创客,你将获得三盒产品的超值优惠,并开启你的创业之路。直推奖的奖励比例设计得十分巧妙,通过三三一循环、三三复制的方式,你只需要成功推荐三位创客,就能迅速回本,实现免费创业。而当你成功晋升为一星创客后,更可享有团队业绩的3%奖励,为你的创业之路增添更多动力。二、业绩奖。这是根据你在团队中的贡献和业绩来设定的奖励。从一星到七星,随着你星级的提升,你将享有越来越高的团队业绩奖励。值得一提的是,这一奖励机制并不要求你必须是直属团队领导,只要你的团队中有符合条件的成员,你就能获得相应的奖励。这样的设计使得团队的发展更加灵活多样,同时也鼓励大家积极合作,共同创造更大的业绩。三、伯乐奖。这是爱贝生独具特色的一项奖励。在大多数团队中,能够拿到团队业绩的2%到5%已经是非常可观的收入了。但在爱贝生,伯乐奖可以让你获得你直属团队业绩的百分百奖励。这意味着你的收入将直接与你团队的业绩挂钩,你团队的发展越好,你的收入就越高。这样的设计不仅激励了团队成员的积极性和创造力,也让你在享受团队成功的同时,实现了个人价值的最大化。四、全球分红则是爱贝生为高级别成员提供的一项特别奖励。当你成功晋升为总裁或董事时,你将享有公司流水的加权分红。这不仅是对你个人能力的认可,也是对你团队贡献的肯定。同时,公司还为前100位达成总裁的成员提供了一次性30万的现金奖励,为前30位达成董事的成员提供了一次性70万的奖金。这样的奖励机制无疑将激励更多的人努力向更高的目标迈进。五、复购奖励。在爱贝生,复购被看作是一种非常重要的行为。公司为了鼓励大家持续购买产品,设立了复购奖励机制。只要你的团队中有成员进行复购,你就能获得相应的奖励。这样的设计不仅提高了产品的复购率,也增强了团队成员之间的凝聚力和向心力。
三一重工成长空间 78人发布 投递七星华创等公司10个岗位
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务