2023 华为笔试题 0524

笔试时间:2023年5月24日 暑期实习

第一题

题目:连续空闲内存合并管理

动态内存管理根据用户的需求分配任意大小的内存,当用户释放内存时,被释放的内存回到池(堆)中供其他用户使用。现设计某实时操作系统计划的内存管理功能,请你实现被释放内存的回收合并模块,当经过一次内存释放操作后,请返回当前最大的连续内存块的起始位置,以及此连续内存的数量(块数)。若存在多个最大连续内存块,则返回编号最小的内存块信息。当前已经把连续内存,按块进行连续编号。

解答要求

时间限制:C/C++1000ms,其他语言:2000ms 内存限制:C/C++256MB其他语言:512MB

输入描述

输入:1,3,2,5 表示释放四块内存,ID分别为1.3.2.5,每块内存的大小为1个单位[预制条件]

函数执行前,所有内存均已被申请完毕,无空闲,不需考虑内存重复释放[取值范围]

内存ID编号:0<ID<2^31-1,单次释放的内存个数<10000

输出描述

输出:1,3 经过回收处理后,当前可用的最大连续内存大小3,以及此内存的起始编号1. 说明:1,3,2,5四块内存,前面三块1,3,2为连续内存,合并后的连续内存数为3个单位起始编号为1,因此返回1,3

样例输入

示例1:

1,3,2,5

示例2:

2,4,3,7,6

样例输出

示例1:

1,3

解释:1,3,2,5四块内存,前面三块1,3,2为连续内存,合并后的连续内存数为3个单位。起始编号为1,因此返回1,3

示例2:

2,3

解释:2,4,3,7,6,表示释放了5块内存,内存块编号分别为2、4、3、7、6。

经过回收合并后,2、3、4三块内存连续,可以合并为一块大内存,大小为3个单位

6、7两块内存连续,合井后的连续内存大小为2。

因此返回此时的最大连续内存的起始位置为2,内存大小为3输入中第二行的十六进制数0xE77F,其中只有前14个bit有效,转换为二进制序列为11100111011111

输出表示有2种补偿方案,分别是右移2个小孔和左移2个小孔,对应的’0‘/’1‘连续字符序列表示所有孔的开关状态.

参考题解

C++:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    string input;
    getline(cin, input);
    vector<int> nums;

    size_t start = 0, found = input.find(",");
    while (found != string::npos) {
        nums.push_back(stoi(input.substr(start, found - start)));
        start = found + 1;
        found = input.find(",", start);
    }
    nums.push_back(stoi(input.substr(start)));

    sort(nums.begin(), nums.end());

    int st = -1, mxlen = -1;
    int n = nums.size();
    int index = 0;

    while (index < n) {
        int i = index;
        for (int j = index + 1; j < n; j++) {
            if (nums[j] - nums[i] != 1) break;
            i++;
        }
        if (mxlen < i - index + 1) {
            mxlen = i - index + 1;
            st = index;
        }
        index = i + 1;
    }

    cout << nums[st] << "," << mxlen << endl;

    return 0;
}

Java:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        String[] numsStr = input.split(",");
        List<Integer> nums = new ArrayList<>();

        for (String numStr : numsStr) {
            nums.add(Integer.parseInt(numStr));
        }

        Collections.sort(nums);

        int st = -1, mxlen = -1;
        int n = nums.size();
        int index = 0;

        while (index < n) {
            int i = index;
            for (int j = index + 1; j < n; j++) {
                if (nums.get(j) - nums.get(i) != 1) break;
                i++;
            }
            if (mxlen < i - index + 1) {
                mxlen = i - index + 1;
                st = index;
            }
            index = i + 1;
        }

        System.out.println(nums.get(st) + "," + mxlen);
    }
}

Python:

nums = [int(c) for c in input().split(",")]

nums.sort()

st, mxlen = -1,-1
n = len(nums)
index = 0
while index < n:
    i = index
    for j in range(index+1, n):
        if nums[j]-nums[i] != 1: break
        i += 1
    if mxlen < i-i

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

2023 秋招笔试题汇总解析 文章被收录于专栏

2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

全部评论

相关推荐

05-29 19:11
已编辑
北方民族大学 Java
😭😭😭😭本人26届双非本,后端选手。从25年秋招开始,一直到春招5月份,一共面了12次字节。可以说后面能继续投递面上字节大概率是因为前面一直累计的面评还不错,但是最终的结果往往不尽如人意,黄梁一梦。timeline:如标题,总共面了12次字节,4个不同的岗位。第一次:抖音生活服务测开二面完排序挂第二次:TikTok国际化电商测开三面完排序挂第三次:飞书后端安全团队三面完挂第四次:飞书后端偏基架团队三面完过,HR面完之后询问综合排序不推进。我知道像BAT这样的公司,双非本想拿到一张入场券有多难,也知道每次挂在排序/三面/HR面,那种差一步上岸又被打回原点的落差感有多磨人。可是最后一次字节的这个岗位,已经是5月中旬才开始面得了,春招末期的岗位,我本以为真的缺人,三面过的那天,我真的以为就差一步hr面就稳了,但是,最终的结果很遗憾,综合排序综合排序,不推进了。如果是技术能力的问题,我想也不会每一轮技术面给我通过。思来想去。难道真的就是因为我们双非有案底,所以最后的一切又算什么呢。付出这么多的时间精力,还是抵不过双非学历太差吗?既然如此一开始直接卡掉简历不用给面试不就行了嘛,每一轮面试都给我们生的希望,最后的最后又回到了那个必输的起点。12次字节,说不遗憾是假的,也无数次怀疑过自己:是不是我算法刷得还不够?是不是项目亮点讲得不够好?是不是学历就是一道跨不过去的坎?但回头看,这一年的秋招到春招,从面对面试官紧张到说话卡壳,到后来的从容面对,再到如今甚至能和面试官探讨AI&amp;大模型技术的一些方案思路,我已经比去年的自己强太多了。可能字节于我,真的是一场盛大的单恋,拼尽全力奔赴,却还是没能收到想要的回应。前路漫漫,字节的梦碎了,但我的路还在继续,希望下一站,会有属于我的一场徐风。
不愿吃饼的山羊很友好:你的心理素质是真的强大,如果是我碰到这样都会疯了
点赞 评论 收藏
分享
评论
2
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务