【Python/Java/C++三种语言】20天拿下华为OD笔试之【哈希表】2023B-单词接龙【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录

  • 题目描述与示例
    • 题目描述
    • 输入描述
    • 输出描述
    • 示例一
      • 输入
      • 输出
      • 说明
    • 示例二
      • 输入
      • 输出
      • 说明
  • 解题思路
  • 代码
    • Python
    • Java
    • C++
    • 时空复杂度
  • 华为OD算法/大厂面试高频题算法练习冲刺训练

题目描述与示例

题目描述

单词接龙的规则是:

可用于接龙的单词首字母必须要前一个单词的尾字母相同

当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;已经参与接龙的单词不能重复使用

现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙,

请输出最长的单词串,单词串是单词拼接而成,中间没有空格

输入描述

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

备注:

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

单个单词的长度的取值范围为[1,30]

输出描述

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

示例一

输入

0
6
word
dd
da
dc
dword
d

输出

worddwordda

说明

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

示例二

输入

4
6
word
dd
da
dc
dword
d

输出

dwordda

说明

先确定起始单词dword,剩余以d开头且长度最长的有dd、da.

dc`,则取字典序最小的`da`,所以最后输出`dwordda。

解题思路

代码

Python

# 题目:2023B-单词接龙
# 分值:100
# 作者:许老师-闭着眼睛学数理化
# 算法:哈希表/排序
# 代码看不懂的地方,请直接在群上提问from collections import defaultdict# 输入起始索引
startIdx = int(input())
# 输入单词个数
n = int(input())# 构建一个哈希表,用于按照单词首字母储存单词列表
# key为某一个首字母first_ch
# value为字母first_ch为首字母的单词列表
dic = defaultdict(list)
# 初始化答案变量ans
ans = ""
# 循环n次,输入每一个单词并储存在哈希表dic中
for i in range(n):# 输入单词wordword = input()# 如果是起始单词,则将word储存在ans中if i == startIdx:ans += wordelse:# 获得单词word的首字母first_ch = word[0]# 把word储存在哈希表dic中,dic[first_ch].append(word)# 需要对dic中,value储存的每一个单词列表进行排序
# 先按照单词长度从小到大排序,再按照字典序逆序排序
# 譬如以'd'为首字母的单词列表应该排序为
# 'd' : ['d', 'dd', 'dc', 'da', 'dword']
for ch in dic:dic[ch].sort(key = lambda x: (-len(x), x), reverse = True)# 进行while循环
# 退出循环的条件为,ans的末尾字母ans[-1],在dic中对应的单词列表长度为0
# 即无法找到进一步单词接龙的单词
while len(dic[ans[-1]]) > 0:# 弹出dic[ans[-1]]的最后一个单词,作为接下来延长的单词following_word = dic[ans[-1]].pop()# 对ans进行延长ans += following_wordprint(ans)

Java

import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int startIdx = scanner.nextInt();int n = scanner.nextInt();// 读取换行符scanner.nextLine(); HashMap<Character, List<String>> dic = new HashMap<>();StringBuilder ans = new StringBuilder();for (int i = 0; i < n; i++) {String word = scanner.nextLine();if (i == startIdx) {ans.append(word);} else {char firstCh = word.charAt(0);dic.putIfAbsent(firstCh, new ArrayList<>());dic.get(firstCh).add(word);}}for (List<String> words : dic.values()) {words.sort((a, b) -> {if (a.length() != b.length()) {return Integer.compare(a.length(), b.length());} else {return b.compareTo(a);}});}while (dic.get(ans.charAt(ans.length() - 1)) != null && !dic.get(ans.charAt(ans.length() - 1)).isEmpty()) {String followingWord = dic.get(ans.charAt(ans.length() - 1)).remove(dic.get(ans.charAt(ans.length() - 1)).size() - 1);ans.append(followingWord);}System.out.println(ans.toString());}
}

C++

#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>using namespace std;int main() {int startIdx;cin >> startIdx;int n;cin >> n;cin.ignore();unordered_map<char, vector<string>> dic;string ans = "";for (int i = 0; i < n; i++) {string word;getline(cin, word);if (i == startIdx) {ans += word;} else {char firstCh = word[0];dic[firstCh].push_back(word);}}for (auto& entry : dic) {sort(entry.second.begin(), entry.second.end(), [](const string& a, const string& b) {if (a.length() != b.length()) {return a.length() < b.length();} else {return a > b;}});}while (!dic[ans.back()].empty()) {string followingWord = dic[ans.back()].back();dic[ans.back()].pop_back();ans += followingWord;}cout << ans << endl;return 0;
}

时空复杂度

时间复杂度:O(NlogM + N)。排序所花费的时间复杂度为O(N/M * MlogM) = O(NlogM) ,接龙过程的时间复杂度为O(N)

空间复杂度:O(N)。哈希表所需要的额外空间。

N为单词个数,M是以某个字母为首字母的单词个数。


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

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

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

相关文章

虚拟机扩容磁盘/dev/mapper/centos-root

虚拟机扩容磁盘/dev/mapper/centos-root 1. 在虚拟机管理界面增加磁盘大小或添加磁盘 2. 扩容操作 lsblk -l # 下面/dev/sdb 每个人的可能不同&#xff0c;有/dev/sda 或 /dev/sdc&#xff0c;根据实际更改 fdis /dev/sdb m n p 1 回车 回车 wfdisk -l pvdisplay pvcrea…

Vue.js中v-if 和 v-show 的区别

1、v-if: v-if 指令是 Vue.js 中的一个条件渲染指令。 当 v-if 的条件为 false 时&#xff0c;元素及其内容将从 DOM 中完全移除。 适用于你期望大部分时间条件为 false&#xff0c;或者当你希望通过完全移除元素来节省资源时。 2、v-show: v-show 指令同样也是一个条件渲染…

信息流广告行为兴趣定向底层逻辑算法

行为兴趣定向 1: 行为兴趣的背后是计划的数据 行为是用户在平台的动作&#xff1a;点赞、评论、分享、点击、下单、成交等&#xff0c;用户发生过的标签 兴趣不一定发生&#xff0c;我有打高尔夫的兴趣&#xff0c;但是从来没打过&#xff0c;因为穷 系统会根据用户的行为标…

C++STL中的string容器

string 容器基本概念 C 风格字符串 ( 以空字符结尾的字符数组 ) 太过复杂难于掌握&#xff0c;不适合大程序的开发&#xff0c; 所以 C 标准库定义了一种 string 类&#xff0c;定义在头文件。 String 和 c 风格字符串对比&#xff1a; u Char*是一个指针&#xff0c; …

【C++ Primer Plus学习记录】第5章编程练习

1.编写一个要求用户输入两个整数的程序。该程序将计算并输出这两个整数之间&#xff08;包括这两个整数&#xff09;所有整数的和。这里假设先输入较小的整数。例如&#xff0c;如果用户输入的是2和9&#xff0c;则程序将指出2~9之间所有整数的和为44。 //5.9 1 #if 1 #includ…

使用OpenMVS重建模型

1、数据格式转换 首先将生成的稠密点云以及图片信息转换成openmvs支持的.mvs文件。在openmvs_sample中的bin文件内打开终端 作者&#xff1a;舞曲的小水瓶 https://www.bilibili.com/read/cv25019877/ 出处&#xff1a;bilibili interfaceCOLMAP.exe -i D:\desktop\test\toy\…

【Linux服务器Java环境搭建】05 Node JS安装及环境变量配置

【Linux服务器Java环境搭建】01购买云服务器以及在服务器中安装Linux系统 【Linux服务器Java环境搭建】02 通过xftp和xshell远程连接云服务器 【Linux服务器Java环境搭建】03 Git工具安装 【Linux服务器Java环境搭建】04 JDK安装&#xff08;JAVA环境安装&#xff09; 【Linux服…

flink源码分析 - 命令行参数解析-CommandLineParser

flink版本: flink-1.11.2 调用位置: org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint#main 代码位置: flink核心命令行解析器: org.apache.flink.runtime.entrypoint.parser.CommandLineParser /** Licensed to the Apache Software Foundati…

基于OpenAPI工具包以及LSTM的CDN网络流量预测

基于LSTM的CDN网络流量预测 本案例是基于英特尔CDN以及英特尔 OpenAPI Intel Extension for TensorFlow* Intel oneAPIDPC Library 的网络流量预测&#xff0c;CDN是构建在现有网络基础之上的智能虚拟网络&#xff0c;目的是将源站内容分发至最接近用户的节点&#xff0c;使用…

unity学习笔记17

一、动画组件 Animation Animation组件是一种更传统的动画系统&#xff0c;它使用关键帧动画。你可以通过手动录制物体在时间轴上的变换来创建动画。 一些重要的属性&#xff1a; 1. 动画&#xff08;Animation&#xff09;&#xff1a; 类型&#xff1a; Animation组件允许…

java为什么要设计8个基本数据类型的封装类型?

Java中的基本数据类型包括byte、short、int、long、float、double、boolean和char。然而&#xff0c;这些基本数据类型并非对象&#xff0c;他们只是简单的数值&#xff0c;无法调用方法。 为了能在Java这种面向对象的语言中更好地操作这些数值&#xff0c;Java设计了对应的8个…

换股解套策略

在股市中&#xff0c;投资者难免会遇到被套的情况。面对这种情况&#xff0c;如何进行换股策略以降低损失并寻求反弹的机会呢&#xff1f;本文将为您详细解析。 一、了解被套的原因 在进行换股策略之前&#xff0c;首先要了解被套的原因。一般来说&#xff0c;被套的原因有以下…

使用Prometheus监控Padavan路由器

Prometheus监控Padavan路由器 1、背景 近期在Synology&#xff08;群辉&#xff09;中安装一套Prometheus监控程序&#xff0c;目前已经监控Synology&#xff0c;然后家中有有路由器&#xff08;Padavan&#xff09;型号&#xff0c;也准备使用PrometheusGrafan进行监控。 ‍…

1、STM32F407 LED Demo

#ifndef、#define、#endif格式条件编译&#xff0c;作用是避免头文件内容比重复定义 main.c #include "stm32f4xx.h" #include "led.h" #include "delay.h" //CPU主时钟168MHz int main(void) {delay_init(168);LED_Init();while(1){GPIO_SetB…

Python 读取电子发票PDF 转成Excel

Python 读取电子发票PDF 转成Excel 目录 0.前提 1.python相关的处理PDF的库 2.实际好用的 3.实际代码 4.思考 0.前提 只识别普通电子发票PDF&#xff0c;提取其中某些关键内容到excel中。 1.python相关的处理PDF的库 如下4个库是经常更新维护的&#xff01; pyP…

采集工具-免费采集器下载

在当今信息时代&#xff0c;互联网已成为人们获取信息的主要渠道之一。对于研究者和开发者来说&#xff0c;如何快速准确地采集整个网站数据是至关重要的一环。以下将从九个方面详细探讨这一问题。 确定采集目标 在着手采集之前&#xff0c;明确目标至关重要。这有助于确定采集…

企业数字化的思考

1. 企业信息化 1.1 从0到1构建信息系统 随着it基础的不断成熟与在企业业务中的应用&#xff0c;企业构建专业化的信息系统已不再需要太多的讨论&#xff0c;基本都在基于自身的阶段构建各种各样的业务支撑系统&#xff0c;从OA\CRM\财务系统\HR\ERP\SAP等到类似更为专项的合同…

flink源码分析 - standalone模式下jobmanager启动过程配置文件加载

flink版本: flink-1.11.2 代码位置: org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint#main /** Licensed to the Apache Software Foundation (ASF) under one* or more contributor license agreements. See the NOTICE file* distributed with t…

SCAU:求数的位数

求数的位数 Time Limit:1000MS Memory Limit:65536K 题型: 编程题 语言: G;GCC 描述 由键盘输入一个不多于9位的正整数&#xff0c;要求输出它是几位数。输入格式 一个整数输出格式 输出该数为几位数输入样例 34921输出样例 6 #include <stdio.h> #include&l…

冲突域和广播域

文章目录 冲突域广播域 冲突域 在网络内部两个数据帧同时进行传输时&#xff0c;产生与发生冲突的区域&#xff0c;所有共享介质都是一个冲突域。冲突域时基于第一层&#xff0c;物理层的。 集线器和中继器因为都在物理层&#xff0c;没有MAC地址表&#xff0c;所以不能隔离冲…