华为OD 连续字母长度

题目描述

给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第 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。特此说明,避免歧义。

import java.util.Scanner;

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        int num = in.nextInt();
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        if(str.length() == 1){
            if(num > 1){
                System.out.println("-1");
                return;
            }else{
                System.out.println("1");
                return;
            }
        }
        for(int i = 0; i + 1 < str.length(); i++){
            int count = 1;
            while(i+1 < str.length() && str.charAt(i) == str.charAt(i + 1)){
                count++;
                i++;
            }
            if((map.get(str.charAt(i)) != null && count > map.get(str.charAt(i)))
                ||map.get(str.charAt(i)) == null){
                   map.put(str.charAt(i), count);
            }
        }
        List<Map.Entry<Character, Integer>> list= new ArrayList<>(map.entrySet());
        Collections.sort(list, (o1, o2) -> o2.getValue().compareTo(o1.getValue()));
        if(num > list.size()){
            System.out.println("-1");return;
        }
        System.out.println(list.get(num - 1).getValue());
    }
}

 

### 华为OD机试 字母贪吃蛇 题目解析 华为OD机试中的贪吃蛇题目,通常要求考生根据一系列移动操作来模拟贪吃蛇的行为,并计算最终蛇的长度。这类题目不仅考察了考生对字符串处理和数组操作的理解,还要求具备较强的逻辑推理能力。 #### 输入输出解析 输入部分通常包含多个部分: 1. **移动操作**:第一行是空格分隔的字母,代表贪吃蛇的移动操作。字母取值为 `U`(上)、`D`(下)、`L`(左)、`R`(右)和 `G`(转向,不移动)。 2. **网格大小**:第二行为空格分隔的两个数字,表示网格的行数 `N` 和列数 `M`。 3. **网格内容**:接下来的 `N` 行,每行是空格分隔的 `M` 个字母,表示网格的状态。`H` 表示贪吃蛇的起始位置,`F` 表示食物,`E` 表示空格。 输出部分通常是贪吃蛇在执行完所有操作后或在游戏结束时的长度。 #### 解题思路 1. **初始化蛇的位置和方向**: - 贪吃蛇的初始长度为 1。 - 初始方向为向左(`L`)。 - 从网格中找到 `H` 的位置作为蛇的起始点。 2. **模拟移动操作**: - 遍历每个操作,根据当前方向更新蛇的头部位置。 - 如果操作是 `G`,则按当前方向移动一格;如果是其他方向指令,则更新方向。 3. **处理边界和碰撞检测**: - 检查蛇的头部是否超出网格范围。 - 检查蛇的头部是否撞到自己的身体(即网格中是否有重复的蛇身位置)。 4. **处理食物和增长**: - 如果蛇的头部移动到了 `F` 的位置,则蛇的长度增加 1,并将该位置标记为蛇的一部分。 - 否则,更新蛇的身体位置,去掉尾部。 5. **返回结果**: - 如果在操作执行完之前游戏结束(如蛇撞墙或撞到自己),返回当前的蛇长度。 - 否则,返回操作完成后蛇的长度。 #### 示例代码(Python) 以下是一个简单的 Python 实现示例,用于模拟贪吃蛇的移动并计算最终长度: ```python def simulate_snake(moves, grid, rows, cols): # 初始化蛇的起始位置 for i in range(rows): for j in range(cols): if grid[i][j] == 'H': snake = [(i, j)] break # 方向映射 direction_map = { 'U': (-1, 0), 'D': (1, 0), 'L': (0, -1), 'R': (0, 1) } # 当前方向 current_direction = 'L' # 移动蛇 for move in moves: if move in ['U', 'D', 'L', 'R']: current_direction = move elif move == 'G': dx, dy = direction_map[current_direction] new_head = (snake[0][0] + dx, snake[0][1] + dy) # 检查是否越界 if not (0 <= new_head[0] < rows and 0 <= new_head[1] < cols): return len(snake) # 检查是否撞到自己 if new_head in snake: return len(snake) # 检查是否吃到食物 if grid[new_head[0]][new_head[1]] == 'F': snake.insert(0, new_head) else: snake.insert(0, new_head) snake.pop() return len(snake) # 示例输入 moves = ['L', 'G', 'D', 'G', 'R', 'G'] grid = [ ['E', 'E', 'E', 'E'], ['E', 'H', 'F', 'E'], ['E', 'E', 'E', 'E'] ] rows, cols = 3, 4 # 调用函数 result = simulate_snake(moves, grid, rows, cols) print(result) ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值