首页 > 其他分享 >华为OD刷题C卷 - 每日刷题 16(连续字母长度,拼接URL)

华为OD刷题C卷 - 每日刷题 16(连续字母长度,拼接URL)

时间:2024-06-08 13:31:08浏览次数:18  
标签:字符 后缀 String 16 URL url 长度 刷题

两段代码分别解决了两个不同的字符串处理问题,下面是对它们的概述:

1、(连续字母长度):

这段代码是解决“连续字母长度”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于找出给定字符串中,按相同字母的最长连续子串长度排序后的第k长的子串的长度。

main方法首先读取一个只包含大写字母的字符串和整数k,然后调用getResult方法并打印结果。

getResult方法首先对字符串进行处理,将字符串末尾添加一个特殊字符(在这里是'0'),以便于处理最后一个字符的状态。然后,遍历字符串并使用一个HashMap来记录每个字符的最长连续子串长度。在遍历过程中,如果当前字符与前一个字符相同,则累加长度;如果不同,则更新HashMap中的记录,并重置当前字符和长度。

遍历结束后,将HashMap中的值(即每个字符的最长连续子串长度)提取出来,降序排序,并转换为数组。最后,检查k是否在数组的有效索引范围内,如果在,则返回第k-1个元素作为结果;如果不在,则返回-1表示无效输入。

2、(拼接URL):

这段代码是解决“拼接URL”的问题。它提供了一个Java类Main,其中包含main方法和joinUrl方法,用于将给定的URL前缀和后缀按照URL拼接规则连接成一个完整的URL。

main方法首先读取由逗号分隔的URL前缀和后缀,然后调用joinUrl方法并打印拼接后的URL。

joinUrl方法首先对前缀和后缀进行处理,去除前缀末尾和后缀开头的多余斜杠(/),然后按照URL的拼接规则,使用一个斜杠将前缀和后缀连接起来。

package OD251;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.StringJoiner;

/**
 * @description 连续字母长度
 * @level 6
 * @score 100
 * @url https://hydro.ac/d/HWOD2023/p/OD251
 */

/**
 * 题目描述
 * 给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第 k 长的子串的长度,相同字母只取最长的那个子串。
 * <p>
 * 输入描述
 * 第一行有一个子串(1<长度<=100),只包含大写字母。
 * <p>
 * 第二行为 k的值
 * <p>
 * 输出描述
 * 输出连续出现次数第k多的字母的次数。
 */
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //输入字符串
        String str = sc.nextLine();
        //读取第k长的字符
        int k = Integer.parseInt(sc.nextLine());
        System.out.println(getResult(str, k));

    }

    public static int getResult(String s, int k) {
        //异常处理
        if (k <= 0) return -1;

        //给s末尾拼接一个0,方便后续比较前后字符是否相同,存入最后一个字符的状态
        s += "0";

        //找出连续字母的最大长度
        char[] chs = s.toCharArray();

        //存放不同字符的最大长度
        HashMap<Character, Integer> map = new HashMap<>();

        //初始状态 上一字符及该字符对应的最大长度
        char pre = chs[0];
        int len = 1;

        for (int i = 1; i < chs.length; i++) {
            //当前字符
            char cur = chs[i];
            if (cur == pre) {
                len++;
            } else {
                //如果当前字符跟上一个不相等,则判断map中是否不存在、或已存在但长度不是最长
                if (!map.containsKey(pre) || map.containsKey(pre) && len > map.get(pre)) {
                    map.put(pre, len);
                }
                //刷新状态
                pre = cur;
                len = 1;
            }
        }

        //只需要用到字符出现的次数排序 降序
        Integer[] arr = map.values().stream().sorted((a, b) -> b - a).toArray(Integer[]::new);

        //无效输出
        if (k > arr.length) return -1;
        else return arr[k - 1];
    }
}
package OD252;

import java.util.Scanner;

/**
 * @description 拼接URL
 * @level 6
 */

/**
 * 题目描述
 * 给定一个url前缀和url后缀,通过,分割 需要将其连接为一个完整的url
 * <p>
 * 如果前缀结尾和后缀开头都没有/,需要自动补上/连接符
 * 如果前缀结尾和后缀开头都为/,需要自动去重
 * 约束:不用考虑前后缀URL不合法情况
 * <p>
 * 输入描述
 * url前缀(一个长度小于100的字符串),url后缀(一个长度小于100的字符串)
 * <p>
 * 输出描述
 * 拼接后的url
 */
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //读取字符串、
        String[] url = sc.nextLine().split(",");
        //可能会出现 ","->[]   "1,"->["1"]  ",1"->["","1"]
        String prefix = url.length > 0 ? url[0] : "";
        String suffix = url.length > 1 ? url[1] : "";
        System.out.println(joinUrl(prefix, suffix));
    }

    //拼接url
    public static String joinUrl(String prefix, String suffix) {
        //把前缀后面的一个或多个/去掉 $表示末尾 +表示一个或多个
        prefix = prefix.replaceAll("/+$", "");
        //把后缀前面的一个或多个/去掉 ^表示开头
        suffix = suffix.replaceAll("^/+", "");
        //用字符/连接
        return prefix + "/" + suffix;
    }
}

标签:字符,后缀,String,16,URL,url,长度,刷题
From: https://blog.csdn.net/2401_84585615/article/details/139429975

相关文章

  • 华为OD刷题C卷 - 每日刷题 17(字符串序列判定,最长的指定瑕疵度的元音子串)
    1、(字符串序列判定):这段代码是解决“字符串序列判定”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于判断字符串S是否是字符串L的有效子串。main方法首先读取两个字符串S和L,然后调用getResult方法并打印最后一个有效字符在L中的位置。getResult方法......
  • 华为OD刷题C卷 - 每日刷题 13(图像物体的边界,英文输入法)
    1、(图像物体的边界):这段代码是解决“图像物体的边界”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,以及一个内部UnionFindSet类,用于计算像素1代表的物体的边界个数。main方法首先读取二维数组的行数m和列数n,然后读取二维数组matrix中的像素值。接着,调用......
  • 华为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[......
  • 「漏洞复现」锐捷校园网自助服务系统 login_judge.jsf 任意文件读取漏洞(XVE-2024-211
    0x01 免责声明请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作者无关,需......
  • 「杂题乱刷」AT_abc160_e
    代码康复训练2024.6.7无所谓,随便贪。直接取前\(x\)大的红苹果,前\(y\)大的绿苹果和和所有无色苹果合起来取最大的\(x+y\)个苹果的值加起来即可。容易证明一定合法。代码:点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出......
  • Day16 | 104.二叉树的最大深度 、111.二叉树的最小深度 、222.完全二叉树的节点个数
    104.二叉树的最大深度(优先掌握递归)什么是深度,什么是高度,如何求深度,如何求高度,这里有关系到二叉树的遍历方式。大家要先看视频讲解,就知道以上我说的内容了,很多录友刷过这道题,但理解的还不够。题目链接/文章讲解/视频讲解:https://programmercarl.com/0104.二叉树的最大深度.ht......
  • timus 1673 & phi & 反phi
    题意:给定\(k\),求一个最小的\(n\)使得有恰好\(k\)个\(i\in[1,n]\),满足对于所有\(j\in[1,n]\),都有\(x\)满足\(ix=j\modn\)并且\(ix\len^2\)​。里面所有数都是正整数。Sol:我们考虑\(\gcd(x,n)>1\)的\(x\)。因为\(\gcd(x,n)>1\),所以\(\operatorname{lcm}(x,n......
  • AlmaLinux 9 环境下部署 PostgreSQL 16 服务
    #将SELinux设置为宽容模式sudosetenforcePermissivesudovi/etc/selinux/configSELINUX=permissive#关闭系统防火墙服务sudosystemctlstopfirewalld.servicesudosystemctldisablefirewalld.service#安装PostgreSQL16服务sudoyuminstall-yhttps:/......
  • Curl 命令参数解析
    Curl参数:详细解析与示例curl是一个功能强大的命令行工具,用于传输数据。它支持多种协议,如HTTP、HTTPS、FTP、SFTP等。curl提供了丰富的参数,以满足各种传输需求。本文将详细解析curl参数,并通过代码示例说明其用法。1.参数概述curl参数分为两大类:通用参数和协议相关......