【2022-08-25】荣耀秋招笔试三道编程题

恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经,目前已更新至美团、微软…
作者@TechGuide【全网同名】
点赞再看,养成习惯,您动动手指对原创作者意义非凡🤝

第一题:大小端字节流解析(100分)

题目描述

在计算机系统内存在两种字节序:大端和小端

大端(Big Endian) 就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

小端(Little Endian) 就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端

以数字0x12345678为例:

大端(Big Endian) 低地址到高地址依次为"0x120x340x56|0x78"

小端(Little Endian) 低地址到高地址依次为"0x7|0x56|0x340x12"

现定义一种字符编码,其编码格式如下:

9个字符为一个编码组

第一个字符表示后续8个字符的字节序(字符’0’表示小端,字符’1’表示大端),后续8个字符,每个字符代表一个字节

编码解析之后字符串采用大端模式

例如编码组"012345678",解析之后的大端字符串为"87654321",编码组"12345678",解析之后的大端字符串为"12345678"

现输入一个数字和一个字符串,数字表示字符串中有多少组编码,需要解析并打印解析后的字符串,具体要求如下:

  1. 按编码组出现的顺序(从左至右)打印一行结果
  2. 解析之后的结果为大端模式
  3. 每个编码组的结果以一个空格分隔
  4. 行末无空格

输入描述

第一行为数字n,表示后续输入的字符串有多少个编码组
第二行为编码字符串

2
0abcdefqh1abcdefgh

输出描述

输出为一行,包含N个编码组解析结果(大端模式),每个结果以一个空格分隔,行末无空格

hafedcba abcdefgh

思路

模拟

代码

JAVA版本
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = 0;
        in.nextLine();
        String[] res = new String[n];
        String line = in.nextLine();
        char[] sc = line.toCharArray();
        int mode = sc[0] - '0';
        int st = 0;
        for (int i=0; i<=sc.length; ++i) {
            if (i == sc.length || i%9==0 && i != 0) {
                // st+1 .. i!
                String sub = new String(sc, st+1, i - st - 1);
                res[k++] = mode == 1 ? sub : new StringBuilder(sub).reverse().toString();
                if (i < sc.length) mode = sc[i] - '0';
                st = i;
            }
        }
        System.out.println(String.join(" ", res));
    }
}
// vx公众号关注TechGuide 实时题库 闪电速递

第二题:视频会议室使用时长最大化(200分)

题目描述

公司2楼有一个视频会议室,会议室的使用由秘书进行安排,每个使用会议的小组都会发送会议使用时间(startend)给秘书,时间用24小时制表示,会议最早开始时间8点,最晚23点结束;会议都是整数小时,上一场会议的结束时间和下一场会议的开始时间可以相同,不考虑会议的重要紧急程度,会考虑会议延迟,作为秘书安排会议的原则就是让会议室的使用时间最长。

输入描述

输入一个数字T,表示有T组测试数据;每个测试数据输入一个数字n(1<n<=100),表示几场会议;然后紧跟着n行数字对,每行分别表示会议开始和会议结束

1
6
15 17
8 11
10 16
11 12
13 15
9 12

输出描述

输出会议室最长使用时间,每组样例输出最终结果,并且单独占用一行

8

思路

DP,dp[i] 表示 8…i 区间内所有安排方案中,占用会议室时长的最大值

代码

JAVA版本
import java.util.*;
public class Main {
    static int func(int[][] arr) {
        int n = arr.length;
        // 8 .. 23
        int[] dp = new int[24];
        for (int i=8; i<=23; ++i) {
            int max = 0;
            for (int j=n-1; j>=0; --j) {
                if (arr[j][1] <= i) {
                    int t = arr[j][1] - arr[j][0] + dp[arr[j][0]];
                    max = Math.max(max, t);
                }
            }
            dp[i] = max;
        }
        return dp[23];

    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 8..23
        int T = sc.nextInt();
        for (int _i=0; _i<T; ++_i) {
            int n = sc.nextInt();
            int[][] arr = new int[n][];
            for (int i=0; i<n; ++i) {
                arr[i] = new int[] {sc.nextInt(), sc.nextInt()};
            }
            int res = func(arr);
            System.out.println(res);
        }
    }
}
// vx公众号关注TechGuide 实时题库 闪电速递

第三题:仓库出租公司(300分)

题目描述

仓库出租公司遇到了一个特殊的客户,该客户有如下要求:

  1. 共有M个货物需要存放,每个货物占用的空间可能是不同的;
  2. 需要提供两个仓库来存放这些物品,而且这两个仓库必须是同型号的,即两个仓库的容量规格是相同的

你作为仓库出租公司的技术人员,请问提供的每个仓库容量规格至少为多少,才能把该客户的所有货物都存放进去?

输入描述

输入共两行

  1. 第一行为一个正整数M,表示货物的个数:
  2. 第二行为M个正整数,分别对应M个货物的占用空间大小,这M个整数并未经过排序。 M的最大值为1000;所有货物占用空间的总和最大值为50000。

3
17811

输出描述

输出一个整数,表示为了存放所有货物,仓库至少应达到的容量规格

19

说明

共3个货物,占用空间分别为17,8,11。
最少需要提供两个容量均为19的仓库,一个存储11,另一个存储17和8,这样才能将所有货物全部装下。

思路

二分+DP,二分仓库容量k,然后用DP判断k是否可以满足条件。 dp[i][j] 表示前 i 个数中是否存在和为 j 的组合,在遍历最后一层判断即可。

代码

import java.util.*;
import java.io.*;
public class Main {

    static boolean chk(int k, int[] arr, int sum) {
        int n = arr.length;
        boolean[][] dp = new boolean[n+1][k+1]; // 前i个数中存在和为 j 的组合
        for (int i=0; i<=n; ++i) dp[i][0] = true;
        for (int i=1; i<=n; ++i) {
            for (int j=1; j<=k; ++j) {
                boolean t = dp[i-1][j];
                if (j-arr[i-1] >= 0) t = (t || dp[i-1][j-arr[i-1]]);
                dp[i][j] = t;
                if (t && j <= k && sum - j <=k) return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        int sum = 0;
        for (int i=0; i<n; ++i) {
            arr[i] = sc.nextInt();
            sum += arr[i];
        }
        int l = sum / 2, r = sum;
        while (l < r) {
            int mi = l + (r - l) / 2;
            if (chk(mi, arr, sum)) r = mi;
            else l = mi + 1;
        }

        System.out.println(l);
    }
}
// vx公众号关注TechGuide 实时题库 闪电速递
荣耀社招2021机考的C语言部分是对应岗位的编程能力进行测试的一项考试。C语言是一种广泛应用于嵌入式系统和高性能应用程序开发的计算机编程语言,对于软件工程师而言,具备良好的C语言编程能力是必不可少的。 C语言考试内容主要包括基础语法、数据类型、运算符、控制结构、函数、指针、数组等方面的知识。考生需要理解程序的控制流,并能够正确运用C语言的语法和特性进行编程。考试题目可能涵盖算法设计、字符串处理、数组操作、结构体操作等多种类型的编程问题。 在机考过程中,考生需要根据题目要求,使用C语言编写程序,完成所要求的功能。考试时间有限,对于考生来说,合理的时间管理和高效的编程技巧是非常重要的。同时,代码的可读性和规范性也是考试评判的重点之一。 对于荣耀社来说,通过机考测试C语言编程能力,能够筛选出具备较高编程素养的求职者,为公司招聘高质量的人才提供了重要的参考。具备出色的C语言编程能力的人员可以更好地适应公司的技术需求,提供高质量的代码实现和良好的工程实践。 总而言之,荣耀社招2021机考C语言部分是对求职者C语言编程能力的考察,考生需要展现出扎实的基础知识,合理的编程思路和高效的编程能力。通过机考荣耀社可以筛选出具备出色编程能力的求职者,为公司的技术发展做出贡献。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值