首页 > 其他分享 >华为OD刷题C卷 - 每日刷题 13(图像物体的边界,英文输入法)

华为OD刷题C卷 - 每日刷题 13(图像物体的边界,英文输入法)

时间:2024-06-08 13:30:30浏览次数:18  
标签:输入法 边界 int 13 单词 fa String new 刷题

1、(图像物体的边界):

这段代码是解决“图像物体的边界”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,以及一个内部UnionFindSet类,用于计算像素1代表的物体的边界个数。

main方法首先读取二维数组的行数m和列数n,然后读取二维数组matrix中的像素值。接着,调用getResult方法并打印结果。

getResult方法首先找出所有与像素5相邻的像素1的格子,并将它们作为边界存储在ArrayList中。然后,使用并查集UnionFindSet来合并相邻的边界。并查集通过比较边界像素之间的距离来确定它们是否相邻,从而将属于同一个边界的像素合并到同一个集合中。

最后,UnionFindSet中的count变量存储了最终的边界数量,并作为结果返回。

2、(英文输入法):

这段代码是解决“英文输入法”的问题。它提供了一个Java类Main,其中包含main方法和match方法,用于实现英文输入法的单词联想功能。

main方法首先读取一段由英文单词和标点符号组成的语句s,然后读取一个英文单词前缀pre。接着,调用match方法并打印匹配到的单词序列。

match方法使用正则表达式将输入语句s分割成单词数组。然后,遍历单词数组,使用TreeSet来存储所有以pre为前缀的单词。TreeSet自动对单词进行排序并避免重复。如果TreeSet为空,则返回前缀pre;否则,使用StringJoiner将排序后的单词序列拼接成字符串并返回。

package OD231;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * @description 图像物体的边界
 * @level 7
 * @score 200
 * @url https://hydro.ac/d/HWOD2023/p/OD231
 */
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    private static int m;
    private static int n;
    private static int[][] matrix;
    //坐标偏移
    private static int[][] offsets = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        m = sc.nextInt();
        n = sc.nextInt();

        matrix = new int[m][n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                matrix[i][j] = sc.nextInt();
            }
        }

        //输出
        System.out.println(getResult());

    }

    public static int getResult() {
        //记录所有边界位置
        ArrayList<Integer[]> brand = new ArrayList<>();

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                //如果是像素5,则扩散
                if (matrix[i][j] == 5) {
                    for (int[] offset : offsets) {
                        int newI = i + offset[0];
                        int newJ = j + offset[1];

                        //如果新位置不越界且为像素1,则是边界
                        if (newI >= 0 && newI < m && newJ >= 0 && newJ < n && matrix[newI][newJ] == 1) {
                            brand.add(new Integer[]{newI, newJ});
                        }
                    }
                }
            }
        }

        int k = brand.size();
        //并查集,对所有边界位置进行合并
        UnionFindSet ufs = new UnionFindSet(k);
        for (int i = 0; i < k; i++) {
            int x1 = brand.get(i)[0];
            int y1 = brand.get(i)[1];

            for (int j = i + 1; j < k; j++) {
                int x2 = brand.get(j)[0];
                int y2 = brand.get(j)[1];

                //如果两个边界像素1的位置横向、纵向距离均小于1,则相邻,合并
                //即所有绕格子5的一圈格子1是一个连通集,边界归于1,如果两个5的一圈边界有相邻,则会归于一个
                if (Math.abs(x1 - x2) <= 1 && Math.abs(y1 - y2) <= 1) {
                    //合并一次则边界-1
                    ufs.union(i, j);
                }
            }
        }

        //返回边界数量
        return ufs.count;
    }


}

//并查集实现
class UnionFindSet {
    //根节点
    int[] fa;
    //边界个数
    int count;

    public UnionFindSet(int n) {
        this.count = n;
        this.fa = new int[n];
        //初始化根节点是自己
        for (int i = 0; i < n; i++) {
            fa[i] = i;
        }
    }

    public int find(int x) {
        if (x != this.fa[x]) {
            this.fa[x] = this.find(this.fa[x]);
            return this.fa[x];
        }
        return x;
    }

    public void union(int x, int y) {
        int x_fa = this.find(x);
        int y_fa = this.find(y);

        //如果两个不同根,则合并
        if (x_fa != y_fa) {
            this.fa[x_fa] = y_fa;
            //边界-1
            this.count--;
        }
    }
}
package OD232;

import java.util.*;

/**
 * @description 英文输入法
 * @level 6
 */

/**
 * 题目描述
 * 主管期望你来实现英文输入法单词联想功能。
 * <p>
 * 需求如下:
 * <p>
 * 依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词,按字典序输出联想到的单词序列,
 * 如果联想不到,请输出用户输入的单词前缀。
 * 注意:
 * <p>
 * 英文单词联想时,区分大小写
 * 缩略形式如”don’t”,判定为两个单词,”don”和”t”
 * 输出的单词序列,不能有重复单词,且只能是英文单词,不能有标点符号
 * 输入描述
 * 输入为两行。
 * <p>
 * 首行输入一段由英文单词word和标点符号组成的语句str;
 * <p>
 * 接下来一行为一个英文单词前缀pre。
 * <p>
 * 0 < word.length() <= 20
 * 0 < str.length <= 10000
 * 0 < pre <= 20
 * 输出描述
 * 输出符合要求的单词序列或单词前缀,存在多个时,单词之间以单个空格分割
 */
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //读取输入
        String s = sc.nextLine();
        //前缀匹配
        String pre = sc.nextLine();
        System.out.println(match(pre, s));

    }

    //根据前缀匹配单词
    public static String match(String pre, String str) {
        //把单词用非字母分隔开
        String[] words = str.split("[^a-zA-Z]");
        //存放前缀匹配成功的单词 防重复,TreeSet自动升序
        TreeSet<String> list = new TreeSet<>();
        for (String word : words) {
            if (word.startsWith(pre)) {
                list.add(word);
            }
        }
        if (list.isEmpty()) {
            return pre;
        } else {
            StringJoiner result = new StringJoiner(" ");
            //按字典排序
            list.forEach(result::add);
            return result.toString();
        }
    }
}

标签:输入法,边界,int,13,单词,fa,String,new,刷题
From: https://blog.csdn.net/2401_84585615/article/details/139429523

相关文章

  • 华为OD刷题C卷 - 每日刷题 8(整形数组按个位值排序,停车场车辆统计)
    两段代码分别解决了两个不同的算法问题,下面是对它们的概述:1、(整形数组按个位值排序):这段代码是解决“整形数组按个位值排序”的问题。它提供了一个Java类Main,其中包含main方法,用于读取输入、执行排序并打印结果。代码首先使用Scanner从标准输入读取一行文本,该文本包含一个......
  • (PAT乙级刷题)String复读机
    题目:题解:#include<iostream>#include<map>usingnamespacestd;map<char,int>mp;intmain(){stringkey="String";stringt;cin>>t;//记录字符数量for(inti=0;i<t.size();i++){mp[......
  • Q13 LeetCode76 最小覆盖子串
    1.难题2.need.containsKey(r)看hashmap中是否含有r3.明天再复盘一遍  1classSolution{2publicStringminWindow(Strings,Stringt){3if(s==null||s.isEmpty()||t==null||t.isEmpty()||s.length()<t.length())return"";4......
  • 解决Docker遇到error NU1301: Unable to load the service index for source https://
    解决Docker容器内无法通过HTTPS访问外部网络的问题在使用Docker构建.NET项目时,有时会遇到无法通过HTTPS访问外部网络的问题,导致dotnetrestore命令无法从NuGet源下载依赖项。本文将介绍一种通过修改Docker配置文件config.json来解决该问题的方法。问题描述在......
  • 6月13日在线研讨会 | 多产品多流程多团队的ALM选择方案
        随着汽车产业步入“软件定义汽车”时代,传统汽车产业的硬件中心模式逐渐被软件与服务的核心地位所取代,这是一场对汽车设计、制造及运营的全方位重塑。在这一转型过程中,如何高效管理汽车的整个生命周期成为了一项全新挑战。在此背景下,应用生命周期管理(ALM)平台应运而生,以......
  • 智能合约开发中13种最常见的漏洞
    在智能合约开发过程中,确实存在多种类型的漏洞,这些漏洞可能导致资金损失、合约功能失效或被恶意利用。以下是智能合约开发中常见的漏洞类型:1.重入攻击2.整数溢出和下溢3.未授权访问4.不当的继承顺序5.短地址攻击6.断言失败7.代理模式中的初始化漏洞8.时间依赖性漏洞9.Gas限......
  • 打卡信奥刷题(60)用Scratch图形化工具信奥P10424 [普及组] [蓝桥杯 2024 省 B] 好数,写
    [蓝桥杯2024省B]好数题目描述一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位……)上的数字是奇数,偶数位(十位、千位、十万位……)上的数字是偶数,我们就称之为“好数”。给定一个正整数N......
  • Android 13.0 hal层关于新增自定义hal模块功能实现
    1.前言在13.0的系统rom定制化开发中,在对hal模块进行开发时,需要通过添加自定义的hal模块来实现某些功能时,就需要添加hal模块的相关功能,接下来就来实现一个案例来供参考接下来就来具体实现这个功能2.hal层关于新增自定义hal模块功能实现的核心类hardware\interfaces\3.ha......
  • ICS TRIPLEX T8800C PD8800 PCB130100 数字输入模块
    T8800CPD8800PCB130100应用领域包括:化学工业纸张制造电力生成石油行业制造业电力行业化学行业等需要自动化控制的工业生产过程。T8800CPD8800PCB130100可以集成到自动化控制系统中,与其他设备和系统协同工作,以提高生产效率、降低能源消耗和减少劳动成本。它还可以设置每......
  • BENTLY 136719-01 地输入输出(I/O)模块
    136719-01 规格:电源供应:24VDC输入类型:加速度频率范围为0.5-10,000Hz温度范围:-10至65°C测量精度:±5%输出:4-20mA,MODBUS尺寸:2.5cmx12.7cmx25.4cm该模块设计用于与特定的BentlyNevada系统模型兼容,连接传感器信号(如振动、邻近探头等)和通信接口到BentlyN......