前言
? ? ? ? 工作了十幾年,從普通的研發工程師一路成長為研發經理、研發總監。臨近40歲,本想辭職后換一個相對穩定的工作環境一直干到老, 沒想到離職后三個多月了還沒找到工作,愁腸百結。為了讓自己有點事情做,也算提高一下自己的編程能力,無聊之余打算用一些大廠的編程題練練手。希望通過這些分享能夠幫到一些人,也希望能和看到此文的大神們溝通交流,提升自己,更希望在此期間能夠找到一份理想的工作。
題目描述
????????給定一個字符串Q,只包含大寫字母,求在包含同一字母的子串中,長度第k長的子串的長度,相同字母只取最長的那個子串。
輸入
- 第一行有一個子串(1<長度<=100),只包含大寫字母。
- 第二行為 k 的值
輸出
????????輸出連續出現次數第 k 多的字母的次數。
示例?
示例1
輸入
AAAAHHHBBCDHHHH
3
輸出
2
說明
同一字母連續出現的最多的是A和H,四次;
第二多的是H,3次,但是H已經存在4個連續的,故不考慮:
下個最長子串是BB,所以最終答案應該輸出2.
示例2
輸入
AABAAA
2
輸出
1
說明
同一字母連續出現的最多的是A,三次;第二多的還是A,兩次,但A已經存在最大連續次數三次故不考慮:
下個最長子串是B,所以輸出1。
示例3
輸入
ABC
4
輸出
-1
說明
只含有3個包含同一字母的子串,小于k,輸出-1
示例4
輸入
ABC
2
輸出
1
說明
三個子串長度均為1,所以此時k=1,k=2,k=3這三種情況均輸出1。特此說明,避免歧義。
解題思路
????????將字母對應的長度放到 Map 中, 最后對 values 進行排序, 取 k 個?
題解?
Java實現
package huawei.e100;import java.util.Arrays;
import java.util.Scanner;
import java.util.TreeMap;/**
* @author arnold
* @date 2024年12月14日
*
*/
public class T23 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while(sc.hasNext()) {String str = sc.nextLine();int s = sc.nextInt();sc.nextLine();System.out.println( run(str, s));}}static int run(String str, int order) {TreeMap<Character, Integer> orders = new TreeMap<>();int n = 1;for (int i = 1; i < str.length(); i++) {if(str.charAt(i) == str.charAt(i-1)) {n++;} else {n = 1;}if (orders.containsKey(str.charAt(i))) {orders.put(str.charAt(i), Math.max(n, orders.get(str.charAt(i))));} else {orders.put(str.charAt(i), n);}}Integer[] strLens = orders.values().toArray(new Integer[orders.size()]);Arrays.sort(strLens);return strLens.length-order >=0? strLens[strLens.length - order] :-1;}}