华为OD机试 - 单词接龙 - 数据结构map、list (Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、输入示例
      • 1、输入:
      • 2、输出
      • 3、说明
    • 五、解题思路
      • 1、核心思想:
      • 2、核心算法是构建一个map:
    • 六、Java算法源码
    • 七、效果展示
      • 1、输入
      • 2、输出
      • 3、说明
      • 4、没有移除后再次拼接的情况,改造一下

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

单词接龙的规则是:

  1. 可用于接龙的单词首字母必须要与前一个单词的尾字母相同;
  2. 当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;
  3. 已经参与接龙的单词不能重复使用。

现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙,请输出最长的单词串,单词串是单词拼接而成,中间没有空格。

二、输入描述

  1. 输入的第一行为一个非负整数,表示起始单词在数组中的索引K,0 <= K < N ;
  2. 输入的第二行为一个非负整数,表示单词的个数N;
  3. 接下来的N行,分别表示单词数组中的单词。

备注:

  • 单词个数N的取值范围为[1, 20];
  • 单个单词的长度的取值范围为[1, 30];

三、输出描述

输出一个字符串,表示最终拼接的单词串。

四、输入示例

1、输入:

0
6
word
dd
da
dc
dword
d

2、输出

worddwordda

3、说明

先确定起始单词word,再接以d开头的且长度最长的单词dword,剩余以d开头且长度最长的有dd、da、dc,则取字典序最小的da,所以最后输出worddwordda。

五、解题思路

1、核心思想:

  1. 可用于接龙的单词首字母必须要与前一个单词的尾字母相同;
  2. 当存在多个首字母相同的单词时,取长度最长的单词;
  3. 如果长度也相等,则取字典序最小的单词;
  4. 已经参与接龙的单词不能重复使用。

2、核心算法是构建一个map:

  • key:每个字符串的第一个字符;
  • value:以key开头的字符串,并按字符串长度、字典顺序排序
  1. 如果接龙字符串builder的末字符,在map中存在,表示有以builder末字符开头的字符串,继续循环;
  2. 获取以“末字符”开头的字符串集合;
  3. 获取排序后的第一个;
  4. 添加到接龙字符串builder;
  5. 在map中移除已经加入接龙的字符串;
  6. 如果此开头的字符串还有其他字符串,再加入map,否则移除;
  7. 获取接龙字符串builder末字符,进行下次判断;
  8. 输出接龙字符串builder

六、Java算法源码

package com.guor.od;import java.util.*;public class OdTest03 {/*** 单词接龙* 核心思想:** 1. 可用于接龙的单词首字母必须要与前一个单词的尾字母相同;* 2. 当存在多个首字母相同的单词时,取长度最长的单词;* 3. 如果长度也相等,则取字典序最小的单词;* 4. 已经参与接龙的单词不能重复使用。*/public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 起始单词在数组中的索引Kint K = Integer.parseInt(scanner.nextLine());// 单词的个数Nint N = Integer.parseInt(scanner.nextLine());// 接下来的N行,分别表示单词数组中的单词List<String> wordList = new ArrayList<>();for (int i = 0; i < N; i++) {wordList.add(scanner.nextLine());}// 获取第一个单词String first = wordList.get(K);// 已经参与接龙的单词不能重复使用,故移除wordList.remove(K);// 最终拼接的单词串StringBuilder builder = new StringBuilder();builder.append(first);/*** key:每个字符串的第一个字符* value:以key开头的字符串,并按字符串长度排序*/Map<String,List<String>> listMap = getListMap(wordList);System.out.println(listMap);// 获取接龙字符串的最后一个字符,作为待接龙字符串的第一个字符String last = builder.substring(builder.length() - 1);// 如果接龙字符串builder的末字符,在map中存在,表示有以builder末字符开头的字符串,继续循环while (listMap.containsKey(last)) {// 获取以“末字符”开头的字符串集合List<String> tempList = listMap.get(last);// 获取排序后的第一个String firstWord = tempList.get(0);// 添加到接龙字符串builderbuilder.append(firstWord);// 在map中移除已经加入接龙的字符串tempList.remove(firstWord);// 如果此开头的字符串还有其他字符串,再加入map,否则移除if(tempList.size()>0){listMap.put(last, tempList);}else {listMap.remove(last);}// 获取接龙字符串builder末字符,进行下次判断last = builder.substring(builder.length() - 1);}// 输出接龙字符串builderSystem.out.println(builder);}/*** key:每个字符串的第一个字符* value:以key开头的字符串,并按字符串长度排序*/public static Map<String,List<String>> getListMap(List<String> wordList) {Map<String,List<String>> listMap = new HashMap<>();for(String word : wordList){String first = String.valueOf(word.charAt(0));List<String> list = null;if(listMap.containsKey(first)){list = listMap.get(first);list.add(word);sortList(list);}else{list = new ArrayList<>();list.add(word);}listMap.put(first,list);}return listMap;}/*** 排序规则:* 1. 当存在多个首字母相同的单词时,取长度最长的单词* 2. 如果长度也相等,则取字典序最小的单词*/private static void sortList(List<String> wordList){wordList.sort(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {if(o1.length()>o2.length()){return -1;}else if(o1.length()<o2.length()){return 1;}else{// 字典排序return o1.compareTo(o2);}}});}
}

七、效果展示

1、输入

0
11
nezha
love
loves
learn
learning
java
j2ee
javas
appl
goj
gpj

2、输出

nezhaappllearninggojjavas

3、说明

构建一个map,key:每个字符串的第一个字符,value:以key开头的字符串,并按照字符串长度、字典顺序排序

{a=[appl], g=[goj, gpj], j=[javas, j2ee, java], l=[learning, learn, loves, love]}

  1. 以第1个字符串开头nezha;
  2. a开头的只有appl,拼接appl,拼接为nezhaappl;
  3. 以l开头的有[learning, learn, loves, love],取第1个字符串learning,拼接为nezhaappllearning;
  4. 以g开头的有[goj, gpj],取第一个字符串goj,拼接为nezhaappllearninggoj;
  5. 以j开头的有[javas, j2ee, java],取第一个字符串javas,拼接位nezhaappllearninggojjavas;

4、没有移除后再次拼接的情况,改造一下

0
11
nezha
love
loves
learn
learning
java
j2ee
javasj
appl
goj
gpj

输出:

{a=[appl], g=[goj, gpj], j=[javasj, j2ee, java], l=[learning, learn, loves, love]}
nezhaappllearninggojjavasjj2ee

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/75250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue中实现3D得球自动旋转

具体实现 安装echarts 在终端下安装echarts npm install -D echarts 安装echarts-gl 在终端下安装echarts-gl npm install -D echarts-gl earth3D组件 earth3D.vue <template><div class"globe3d-earth-container" ><div class"globe3d-earth&qu…

CK_Label-V23货架标签(电池版本)接口文档

查询标签信息接口 接口类型&#xff1a;POST, 参数格式&#xff1a;json array 链接形式&#xff1a; http://localhost/wms/associate/getTagsMsg 代码形式&#xff1a; { url : http://localhost/wms/associate/getTagsMsg, requestMethed : GET, requestParameter :…

AKF拆分原则

在分布式软件环境下&#xff0c;为了保障分布式架构的可靠性、可扩展、高性能&#xff0c;通常会通过集群、扩容、数据分治等思想来实现&#xff0c;比如很多中间件的使用Redis、ZK、Kafka等&#xff0c;都可以通过这种设计思想来提高系统架构吞吐量。AKF是一个系统化的拓展思想…

苹果电脑快捷键集合

苹果电脑Windows系统下的ALT键是组合键。苹果电脑键盘左下角的Fnoption是Windows的alt键。同时按下两个键是ALT键的功能。在非组合状态下&#xff0c;单独按Option键。 补充&#xff1a; 1. 按controlalt&#xff08;选项&#xff09;delete 启动任务管理器。 2. Option-Del…

Mysql数据库之常用SQL语句及事务学习总结

数据库介绍 几个常见的缩写&#xff1a; DB&#xff1a;数据库。全称&#xff1a;DataBase。DBMS&#xff1a;数据库管理系统。全称&#xff1a;DataBase Management System。DBS&#xff1a;数据库系统。全称&#xff1a;DataBase System。DBA&#xff1a;数据库管理员。全称…

初识Nacos

前言 Nacos是一个用于微服务架构下的服务发现和配置管理以及服务管理的综合解决方案&#xff08;官网介绍&#xff09;&#xff0c;这里的服务发现其实就是注册中心&#xff0c;配置管理就是配置中心&#xff0c;而服务管理是二者的综合&#xff1b; Nacos特性 1.服务发现与…

什么是Linux

什么是Linux&#xff1f; 不知道大家是什么时候开始接触Linux&#xff0c;我记得我是大三的时候&#xff0c;那时候通过国嵌、韦东山的教学视频&#xff0c;跟着搭bootloader&#xff0c;修改内核&#xff0c;制作根文件系统&#xff0c;一步步&#xff0c;视频真的很简单&…

两性养生网站源码 生活类减肥网站源码 健康网模板源码 支持QQ登录和百度主动推送

本套模板非常适合生活类&#xff0c;两性类&#xff0c;减肥类等等类型的网站&#xff0c;这类型网站比较好做流量&#xff0c;因为客户群体众多&#xff0c; 可以自行改内容为其他类型网站模板总体非常简洁漂亮&#xff0c;配色合理&#xff0c;视觉舒服&#xff0c;并且配合…

HarmonyOS实现几种常见图片点击效果

一. 样例介绍 HarmonyOS提供了常用的图片、图片帧动画播放器组件&#xff0c;开发者可以根据实际场景和开发需求&#xff0c;实现不同的界面交互效果&#xff0c;包括&#xff1a;点击阴影效果、点击切换状态、点击动画效果、点击切换动效。 相关概念 image组件&#xff1a;图片…

IP175LLF基本参数和引脚图

特性 宽工作温度范围IP175LLF(0C至70C) IP175LLFI(-40C至85C)内置5个MAC和4个PHY 每个端口可配置为10base-t、100Base-TX 最多2K个MAC地址支持自极性10Mbps 汽车MDI-MDIX 支持1个MII/RMII端口Layer2-4多字段分类器 支持8-MultiField输入支持交通政策支持多字段过滤器 支…

静态链表处理

静态链表是指使用数组来表示节点。在C中&#xff0c;可以使用数组来创建静态列表&#xff0c;其中每个元素都有固定的位置和索引。可以通过下标寻址的方式来访问和操作列表中的元素。 单向列表&#xff1a; struct linkednode{int data;int next; }node[N]; 双向链表&#x…

K8S1.23.6版本详细安装教程以及错误解决方案(包括前置环境,使用部署工具kubeadm来引导集群)

准备工作&#xff08;来自官方文档&#xff09; 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。每台机器 2 GB 或更多的 RAM&#xff08;如果少于这个数字将会影响你应用的运行内存&#xf…

HJ23 删除字符串中出现次数最少的字符

描述 实现删除字符串中出现次数最少的字符&#xff0c;若出现次数最少的字符有多个&#xff0c;则把出现次数最少的字符都删除。输出删除这些单词后的字符串&#xff0c;字符串中其它字符保持原来的顺序。 数据范围&#xff1a;输入的字符串长度满足 1≤n≤20 &#xff0c;保…

vue使用wangEditor

vue版本2.0&#xff1b;editor5.1.23版本&#xff1b;editor-for-vue&#xff1a;1.0.2版本 api文档入口 效果图 点击查看如何封装 安装步骤入口 npm install wangeditor/editor --savenpm install wangeditor/editor-for-vue --save代码&#xff08;未封装过的&#xff09;…

Layui快速入门之第三节栅格布局

目录 一&#xff1a;栅格布局的基本概念 二&#xff1a;栅格布局规则 三&#xff1a;始终等比例水平排列案例 四&#xff1a;响应式规则 五&#xff1a;移动设备、桌面端的组合响应式展现案例 六&#xff1a;移动设备、平板、桌面端的复杂组合响应式展现案例 七&#xf…

day35 线程

程序&#xff1a;是为了完成特定的任务&#xff0c;用某种语言编写的一组有序指令的集合&#xff0c;是一段静态的代码 进程&#xff1a;是程序的一次执行过程 线程&#xff1a;线程是进程中的一个执行单元 线程是调度和执行的单位 处理器和线程间的关系 创建线程(重点) 创建…

大数据课程L5——网站流量项目的实时业务系统搭建

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 掌握网站流量项目的 Flume—>Kafka 连通; ⚪ 掌握网站流量项目的实时业务系统搭建; 一、Flume—>Kafka 连通 1. 实现步骤 1. 启动三台服务器。 2. 启动 Zookeeper 集群。 执行指…

2023国赛 B题论文 基于多波束测深技术的海洋探测建模与分析

因为一些不可抗力&#xff0c;下面仅展示小部分论文&#xff0c;其余看文末 一、问题重述 1.1 问题背景 海洋测深是测定水体深度与海底地形的重要任务&#xff0c;有两种主要技术&#xff1a;单波束测深与多波束测深。单波束适用于简单任务&#xff0c;但多波束可提供更精确…

【2023高教社杯】B题 多波束测线问题 问题分析、数学模型及参考文献

【2023高教社杯】B题 多波束测线问题 问题分析、数学模型及参考文献 1 题目 1.1 问题背景 多波束测深系统是利用声波在水中的传播特性来测量水体深度的技术&#xff0c;是在单波束测深的基础上发展起来的&#xff0c;该系统在与航迹垂直的平面内一次能发射出数十个乃至上百个…

【C刷题】day1

一、选择题 1.正确的输出结果是 int x5,y7; void swap() { int z; zx; xy; yz; } int main() { int x3,y8; swap(); printf("%d,%d\n"&#xff0c;x, y); return 0; } 【答案】&#xff1a; 3&#xff0c;8 【解析】&#xff1a; 考点&#xff1a; &#xff…