首页 > 其他分享 >华为OD-机试

华为OD-机试

时间:2023-08-27 22:22:25浏览次数:36  
标签:优先级 matrix int OD equals priority ++ 华为 机试

B 卷

100 分题 1:支持优先级的队列

实现一个支持优先级的队列,高优先级先出队列,同优先级时先进先出。
如果两个输入数据和优先级都相同,则后一个数据不入队列被丢弃。
队列存储的数据内容是一个整数。

输入描述:一组待存入队列的数据(包含内容和优先级)。

输出描述:队列的数据内容(优先级信息输出时不再体现)。

补充说明:不用考虑数据不合法的情况,测试数据不超过100个。

示例1
输入:(10,1),(20,1),(30,2),(40,3)

输出:40,30,10,20

说明:
输入样例中,向队列写入了4个数据,每个数据由数据内容和优先级组成。输入和输出内容都不含空格。
数据40的优先级最高,所以最先输出,其次是30:10和20优先级相同,所以按输入顺序输出

示例2
输入:(10,1),(10,1),(30,2),(40,3)

输出:40,30,10

说明:数据40的优先级最高,所以最先输出,其次是30;两个10和10构成重复数据,被丢弃一个。

/**
 * 优先队列节点定义
 */
class PriorityQueueItem {
    int data;
    int priority;

    public PriorityQueueItem(int data, int priority) {
        this.data = data;
        this.priority = priority;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        List<PriorityQueueItem> queue = new ArrayList<>();
        /*
        获取并处理输入:获取一整行字符串并拆分提取数据
         */
        while (in.hasNext()) {
            String[] element = in.next().split(",");
            for (int i = 0; i < element.length; i += 2) {
                int data = Integer.parseInt(element[i].substring(1));
                int priority = Integer.parseInt(element[i + 1].substring(0, element[1].length() - 1));
                addToQueue(queue, data, priority);
            }
        }
        /*
        打印
         */
        for (int i = 0; i < queue.size(); i++) {
            if (i == queue.size() - 1) System.out.print(queue.get(i).data);
            else System.out.print(queue.get(i).data + ",");
        }
    }

    private static void addToQueue(List<PriorityQueueItem> queue, int data, int priority) {
        // 排除重复元素
        for (PriorityQueueItem item : queue) {
            if (item.data == data && item.priority == priority) return;
        }
        // 遍历整个优先队列,如果优先级小于准备插入的节点,就将节点插入到当前位置
        // 为了实现相同优先级先进入的先插入,则只能是 >
        // 这里并不适合改成二分查找,因为并不是找一个确定的位置,而是找第一个优先级更小的位置
        for (int i = 0; i < queue.size(); i++) {
            if (priority > queue.get(i).priority) {
                queue.add(i, new PriorityQueueItem(data, priority));
                return;
            }
        }
        queue.add(new PriorityQueueItem(data, priority));
    }
}

100 分题 2:计算最大乘积

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String[] arr = in.nextLine().split(",");
        int max = 0;
        /*
        两两检查
         */
        for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (!check(arr[i], arr[j])) max = Math.max(max, arr[i].length() * arr[j].length());
            }
        }
        System.out.println(max);
    }

    /**
     * 检查两个字符串中是否有相同的字符
     * 转化为字符数组并排序,每次移动较小的字符
     */
    private static boolean check(String str1, String str2) {
        char[] chars1 = str1.toCharArray();
        char[] chars2 = str2.toCharArray();
        Arrays.sort(chars1);
        Arrays.sort(chars2);
        int i = 0, j = 0;
        while (i < str1.length() && j < str2.length()) {
            if (chars1[i] == chars2[j]) return true;
            else if (chars1[i] > chars2[j]) j++;
            else i++;
        }
        return false;
    }

做法挺直接的,如果说字符都限定为小写字母的化,还能进一步优化

200 分题 3:学生方阵

学校组织活动,将学生排成一个矩形方阵。
请在矩形方阵中找到最大的位置相连的男生数量。
这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的。
注:学生个数不会超过10000

输入描述:输入的第一行为矩阵的行数和列数,接下来的n行为矩阵元素,元素间用”,”分隔。
输出描述:输出一个整数,表示矩阵中最长的位置相连的男生个数。

示例

输入
3,4
F,M,M,F
F,M,M,F
F,F,F,M
输出
3

输入
1,2
M,M
输出
2

输入
2,1
M
F
输出
1

点击查看代码
public static void main(String[] args) {
        /*
        获取输入
         */
        Scanner in = new Scanner(System.in);
        String[] str = in.nextLine().split(",");
        int m = Integer.parseInt(str[0]);
        int n = Integer.parseInt(str[1]);
        // 构造矩阵
        String[][] matrix = new String[m][n];
        for (int i = 0; i < m; i++) {
            String[] row = in.nextLine().split(",");
            System.arraycopy(row, 0, matrix[i], 0, n);
        }
        // 从左往右,从上往下,对角线和反对角线
        int[][] dp = new int[m][n];
        int[][] dp2 = new int[m][n];
        int[][] dp3 = new int[m][n];
        int[][] dp4 = new int[m][n];
        int ans = 0;
        // 处理只有一行/一列的特例
        if (m == 1) {
            if (matrix[0][0].equals("M")) dp[0][0] = 1;
            for (int j = 1; j < n; j++)
                if (matrix[0][j - 1].equals("M")) {
                    // 如果是连续的长度加一
                    if (matrix[0][j].equals("M")) dp[0][j] = dp[0][j - 1] + 1;
                } else {
                    // 不连续重新确定起点
                    if (matrix[0][j].equals("M")) dp[0][j] = 1;
                }
            for (int j = 0; j < n; j++) ans = Math.max(ans, dp[0][j]);
            System.out.println(ans);
            return;
        }
        if (n == 1) {
            if (matrix[0][0].equals("M")) dp2[0][0] = 1;
            for (int i = 1; i < m; i++) {
                if (matrix[i - 1][0].equals("M")) {
                    if (matrix[i][0].equals("M")) dp2[i][0] = dp2[i - 1][0] + 1;
                } else {
                    if (matrix[i][0].equals("M")) dp2[i][0] = 1;
                }
            }
            for (int i = 0; i < m; i++) ans = Math.max(ans, dp2[i][0]);
            System.out.println(ans);
            return;
        }
        /*
        初始化准备开始动态规划
         */
        for (int i = 0; i < m; i++) {
            // 初始化列
            if (matrix[i][0].equals("M")) {
                dp[i][0] = 1;
                dp2[i][0] = 1;
                dp3[i][0] = 1;
            }
        }
        for (int j = 0; j < n; j++) {
            // 初始化行
            if (matrix[0][j].equals("M")) {
                dp[0][j] = 1;
                dp2[0][j] = 1;
                dp3[0][j] = 1;
                dp4[0][j] = 1;
            }
        }
        // 单独初始化dp4
        for (int i = 0; i < m; i++) if (matrix[i][n - 1].equals("M")) dp4[i][n - 1] = 1;

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j].equals("M")) {
                    dp[i][j] = dp[i][j - 1] + 1;
                    dp2[i][j] = dp2[i - 1][j] + 1;
                    dp3[i][j] = dp3[i - 1][j - 1] + 1;
                }

            }
        }
        /*
        单独处理反对角线
         */
        for (int i = 1; i < m; i++) {
            for (int j = n - 2; j >= 0; j--) {
                if (matrix[i][j].equals("M")) {
                    if (matrix[i - 1][j + 1].equals("M")) dp4[i][j] = dp4[i - 1][j + 1] + 1;
                }
            }
        }

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                ans = Math.max(ans, Math.max(dp[i][j], Math.max(dp2[i][j], Math.max(dp3[i][j], dp4[i][j]))));
            }
        }
        System.out.println(ans);
    }

dp[i][j] 就代表了从左往右/上往下/对角线/反对角线,第 i 行 / 列 以 j 位置结尾的最大男生连续数量

标签:优先级,matrix,int,OD,equals,priority,++,华为,机试
From: https://www.cnblogs.com/yaocy/p/17660564.html

相关文章

  • VSCode中配置Python运行环境
    1首先需要下载相应的包可以在官网中分别下载python和anaconda的安装包,按照步骤进行下载安装即可。python安装成功的标志为cmd中输入python可以进入python的运行环境。anaconda安装成功的标志为打开anacondaprompt可以输入“condalist”来查看目前已经集成的库。2在VSCode中下载......
  • cocos creator使用用vscode调试
    1.vscode安装 JavaScriptDebugger(Nightly)2.修改launch.json里面端口的值端口号是cocoscreator运行打开网页的端口号,vscodelaunch.json修改好后,保存,按F5就要吧启动调试了,原typescript文件里面打断点,可以到达......
  • Codeforces Round 885 (Div. 2) F. Vika and Wiki(数学,倍增)
    题目链接:https://codeforces.com/problemset/problem/1848/F 大致题意:长度为n(n是2的幂次),每轮让a【i】=a【i】^a【i%n+1】,(^为异或)问需要操作多少次后可以使得每个数为0; 解题思路:我们来观察:第一次相当于:a【i】=a【i】^a【i+1】,a【i+1】=a【i+1】^a【i+2】第二次......
  • Educational Codeforces Round 152 (Rated for Div. 2)E. Max to the Right of Min(数
    题目链接:https://codeforces.com/problemset/problem/1849/E 大致题意: 长度为n的序列,求有多少个区间满足区间最大值在区间最小值的右边? 解题思路: (此题有使用线段树等其他做法,本处使用的是单调栈做法) 我们先求出每个a【i】的左边的比他小的LMIN,左边比他大的LMAX,右......
  • Codeforces Round 889 (Div. 1)C. Expected Destruction(期望,动态规划)
    题目链接:https://codeforces.com/problemset/problem/1854/C 大致题意: 有一个集合S,和一个上界m; 现在每秒钟可以进行一次如下操作: 1:等概率的选取S中的一个元素x;2:将x从S中移走;3:如果x+1不大于m并且x+1不在S中,那么添加x+1在S里面 问期望多少秒钟后可以使得S为空集(答......
  • Codeforces Round 889 (Div. 1) B. Earn or Unlock(dp,bitset)
    题目链接:https://codeforces.com/problemset/problem/1854/B 题目大致题意: 有n张卡牌从上到下堆叠,每张卡片有锁或不锁俩种状态,一开始第一张是不锁的;对最上面的卡牌,如果他是不锁的状态,那么可以进行俩种操作:1:从上到下,将v张被锁的卡牌解锁;2:获取v点能量现在求能获得的最大的......
  • Codeforces Round 890 (Div. 2) supported by Constructor Institute D. More Wrong(交
    题目链接:https://codeforces.com/contest/1856/problem/D 大致题意:这是一道交互题,有1~n的排列p,对于每次询问,你可以花费(R-L)2的代价去得到区间【L,R】之内的逆序对的个数,你需要在5n2的代价内得到n的位置。 初步思路: 首先我们来思路,在什么时候,我们可以确定那个位置是n。假......
  • 论文解读(PERL)《PERL: Pivot-based Domain Adaptation for Pre-trained Deep Contextua
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]论文信息论文标题:PERL:Pivot-basedDomainAdaptationforPre-trainedDeepContextualizedEmbeddingModels论文作者:EyalBen-David、CarmelRabinovitz、RoiReichart论文来源:2020TACL论文地址:download 论文代码:download视屏......
  • SpringBoot启动时:Process finished with exit code 0解决办法
    Processfinishedwithexitcode0并不是报错了,这个表示程序正常执行完毕退出了。这就表示项目启动成功后了,此时运行,最后运行完毕自动退出。但我们是需要访问路径的,所以需要引入webjar包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot......
  • Kepserver作为ModbusTCP Server数据上传案例
    该案例已实现于物联温湿度传感器采集第一步:数据采集(此处以ModbusRTU为例不做具体说明)  第二步:数据转发设置: (请参考我的博文: kepserver作为ModbusTcp服务器与外围设备通信)  第三步:数据采集和数据转发关联 ......