两段代码分别解决了两个不同的字符串处理问题,下面是对它们的概述:
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;
}
}