虾皮笔试 虾皮笔试题 0903

笔试时间:2024年09月03日 秋招

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

第一题

题目:最大总和

给定一个包含正整数的数组 nums 和一个正整数k,你需要从数组中选择k个数,使得这k个数的总和最大。

输入描述

数组nums,长度n,1≤n≤100,数组中的元素都是正整数。整数k,1≤k≤n。

输出描述

一个整数,表示选出的k个数的最大总和。

样例输入

[4,3,2,7,9],3

样例输出

20

参考题解

小顶堆。

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

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int getMaxSum(const vector<int>& nums, int k) {
    // 使用优先队列(最小堆)来维护k个最大元素
    priority_queue<int, vector<int>, greater<int>> minHeap;

    // 遍历数组元素
    for (int num : nums) {
        // 如果堆还没有满,直接添加
        if (minHeap.size() < k) {
            minHeap.push(num);
        } else if (num > minHeap.top()) {
            // 如果堆已满且当前元素大于堆顶元素,替换堆顶元素
            minHeap.pop();
            minHeap.push(num);
        }
    }

    // 计算k个最大元素的总和
    int maxSum = 0;
    while (!minHeap.empty()) {
        maxSum += minHeap.top();
        minHeap.pop();
    }

    return maxSum;
}

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

public static int getMaxSum(int[] nums, int k) {
        // 使用优先队列来维护k个最大元素
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();

        // 遍历数组元素
        for (int num : nums) {
            // 如果堆还没有满,直接添加
            if (minHeap.size() < k) {
                minHeap.offer(num);
            } else if (num > minHeap.peek()) {
                // 如果堆已满且当前元素大于堆顶元素,替换堆顶元素
                minHeap.poll();
                minHeap.offer(num);
            }
        }

        // 计算k个最大元素的总和
        int maxSum = 0;
        while (!minHeap.isEmpty()) {
            maxSum += minHeap.poll();
        }

        return maxSum;
}

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

import heapq

def get_max_sum(nums, k):
    # 使用最小堆来维护k个最大元素
    min_heap = []

    # 遍历数组元素
    for num in nums:
        # 如果堆还没有满,直接添加
        if len(min_heap) < k:
            heapq.heappush(min_heap, num)
        elif num > min_heap[0]:
            # 如果堆已满且当前元素大于堆顶元素,替换堆顶元素
            heapq.heappop(min_heap)
            heapq.heappush(min_heap, num)

    # 计算k个最大元素的总和
    max_sum = sum(min_heap)

    return max_sum

第二题

题目:最频子串

给定一个字符串s和一个整数k,你需要找出字符串s中所有长度为k的子串中出现频率最多的子串。如果有多个子串出现频率相同,则返回字典序最小的那个子串。

输入描述

字符串s,长度n,1≤n≤100。

整数k,0≤k≤n。

输出描述

出现频率最高的子串。

样例输入

"mississippi",2

样例输出

“is”

说明

说明:is和si出现的频率一样,但是is在字典次序更小,所以输出is

参考题解

使用 HashMap 来存储每个长度为 k 的子串及其出现频率。2、遍历字符串 s,对于每个长度为 k 的子串,更新其在 HashMap 中的频率计数。3、找出最频子串:遍历 HashMap,找出出现频率最高的子串。如果存在多个子串出现频率相同,则选择字典序最小的子串。

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

#include <iostream>
#include <unordered_map>
#include <string>

using namespace std;

string findMostFrequentSubstring(const string& s, int k) {
    if (k == 0 || s.length() < k) {
        return "";
    }

    // 存储子串的频率
    unordered_map<string, int> frequencyMap;

    // 遍历所有长度为k的子串并计算频率
    for (int i = 0; i <= s.length() - k; i++) {
        string substring = s.substr(i, k);
        frequencyMap[substring]++;
    }

    // 找出频率最高的子串,并处理字典序
    int maxFrequency = 0;
    string mostFrequentSubstring = "";
    for (const auto& entry : frequencyMap) {
        const string& substring = entry.first;
       

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

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

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

全部评论
感觉虾皮笔试不难,不知道面试如何
点赞 回复 分享
发布于 10-08 16:49 广东

相关推荐

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