阿里云笔试 阿里云笔试题 0414

笔试时间:2024年04月14日

历史笔试传送门:2023秋招笔试合集

第一题

题目

给你一个长度为n的数组a,可以对数组一个元素进行减半,问操作后数组众数的最大值。

输入描述

第一行输入一个正整数n,代表数组长度,第二行 n 个整数,表示输入的数组 a

输出描述

一个整数 x,表示操作后数组众数的最大值。

样例输入

5

1 3 2 2 5

样例输出

2

参考题解

枚举每个数X,如果数2X 或2X+1 存在,那么当前数的出现次数可以增加1。如果大于n/2,更新答案。

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

#include <bits/stdc++.h>

const int inf = 0x3f3f3f3f;
using i64 = long long;

void solve() {
    int n;
    std::cin >> n;
    std::vector<int> a(n);
    std::map<int, int> cnt;
    
    for (int i = 0; i < n; ++i) {
     std::cin >> a[i];
     cnt[a[i]]++;
    }
 
    int ans = 0;
    if (n == 1) {
     std::cout << a[0] / 2 << "\n";
     return;
    }

    for (int i = 0; i < n; ++i) {
     if (cnt.count(a[i] * 2) or cnt.count(a[i] * 2 + 1)) {
      if ((cnt[a[i]] + 1) * 2 >= n) {
       ans = std::max(ans, a[i]);
      }
     }
     if (cnt[a[i]] * 2 >= n) {
      ans = std::max(ans, a[i]);
     }
    }
    std::cout << ans << "\n";
}

int main() {
    std::cin.sync_with_stdio(false);
    std::cin.tie(0);
    
    solve();

    return 0;
}

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

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        solve(sc);
    }

    static void solve(Scanner sc) {
        int n = sc.nextInt();
        int[] a = new int[n];
        Map<Integer, Integer> cnt = new HashMap<>();

        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
            cnt.put(a[i], cnt.getOrDefault(a[i], 0) + 1);
        }

        int ans = 0;
        if (n == 1) {
            System.out.println(a[0] / 2);
            return;
        }

        for (int i = 0; i < n; i++) {
            if (cnt.containsKey(a[i] * 2) || cnt.containsKey(a[i] * 2 + 1)) {
                if ((cnt.get(a[i]) + 1) * 2 >= n) {
                    ans = Math.max(ans, a[i]);
                }
            }
            if (cnt.get(a[i]) * 2 >= n) {
                ans = Math.max(ans, a[i]);
            }
        }
        System.out.println(ans);
    }
}

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

def solve():
    import sys
    input = sys.stdin.read
    data = input().split()
    
    n = int(data[0])
    a = list(map(int, data[1:n+1]))
    cnt = {}
    
    for num in a:
        if num in cnt:
            cnt[num] += 1
        else:
            cnt[num] = 1
    
    ans = 0
    if n == 1:
        print(a[0] // 2)
        return
    
    for num in a:
        if (num * 2 in cnt) or (num * 2 + 1 in cnt):
            if (cnt[num] + 1) * 2 >= n:
                ans = max(ans, num)
        if cnt[num] * 2 >= n:
            ans = max(ans, num)
    
    print(ans)

if __name__ == "__main__":
    import sys
    input = sys.stdin.read
    solve()

第二题

题目

小红定义一个字符串是“好串”,当且仅当其满足以下条 1.任意'o'字符最多和一个'o’字符相邻,最多和一个'x'字件:符相邻。2.仼意’x'字符不能和'x'字符相邻。例如,“ooxoo"和"xooxo"是好串,而"xox"、"oxxo"

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

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

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

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务