华为机试 - 单词接龙
admin
2024-02-01 20:58:43

目录

题目描述

输入描述

输出描述

用例

题目解析

算法源码


题目描述

单词接龙的规则是:

  • 可用于接龙的单词首字母必须要前一个单词的尾字母相同;
  • 当存在多个首字母相同的单词时,取长度最长的单词,如果长度也相等,则取字典序最小的单词;已经参与接龙的单词不能重复使用。
  • 现给定一组全部由小写字母组成单词数组,并指定其中的一个单词作为起始单词,进行单词接龙,
  • 请输出最长的单词串,单词串是单词拼接而成,中间没有空格。

输入描述

  • 输入的第一行为一个非负整数,表示起始单词在数组中的索引K,0 <= 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。

题目解析

逻辑题,主要考察数组操作,如数组元素删除,数组自定义排序。

我的解题思路如下:

先用splice方法,将起始单词从输入数组中删除,splice会将删除的元素形成一个新数组,我刚好将该数组作为收集接龙单词的链条数组chain。

之后,遍历输入数组中剩下的单词,将它们根据首字母进行分类,同一个首字母的单词存放在一个数组中。存储容器选择对象prefix,首字母作为对象的属性,存放同首单词的数组为对象的属性值。

当统计完后,对每个分类数组进行排序,即优先按照单词长度降序,如果单词长度相同,再按照字典序升序。

之后,取出chain的尾巴元素,再取出尾巴元素单词的尾巴字符tail,如果存在prefix[tail],则取出prefix[tail]数组的头部元素加入chain中,然后继续循环前面逻辑,如果不存在prefix[tail],则结束循环,将chain.join('') 当成结果输出。

算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];
let k, n;
rl.on("line", (line) => {lines.push(line);if (lines.length === 2) {[k, n] = lines.map(Number);}if (n && lines.length === n + 2) {const words = lines.slice(2);console.log(wordChain(words, k));lines.length = 0;}
});function wordChain(words, k) {const chain = words.splice(k, 1);const prefix = {};words.forEach((word) => {const w = word[0];prefix[w] ? prefix[w].push(word) : (prefix[w] = [word]);});for (let key in prefix) {prefix[key].sort((a, b) =>a.length === b.length ? (a > b ? 1 : -1) : b.length - a.length);}while (true) {let tail = chain.at(-1).at(-1);if (prefix[tail]) {chain.push(prefix[tail].shift());} else {break;}}return chain.join("");
}

相关内容

热门资讯

从哈尔滨到长白山闺蜜5天4晚天... 从哈尔滨到长白山闺蜜5天4晚天池+延吉边境:拍照打卡真实体验 一、出发前的纠结:比老板还难搞的攻略,...
搭上低空经济、AI文旅?两连板... 来源:e公司 桂林旅游(000978)回应市场热点。 9月8日,桂林旅游再度涨停,斩获2连板。当天晚...
八达岭长城国庆怎么去最省心?坐... 八达岭长城是来北京必去的景点之一,尤其是第一次来北京的游客。但国庆期间去八达岭,最大的挑战不是爬长城...
秋日睦邻游园会热闹开锣!居民重... (来源:上观新闻) 近日,殷行街道包头路社区睦邻活动室里,举办了一场秋日睦邻趣味游园会,辖区居民、户...
带父母去长白山怎么玩?3天2晚... 带父母去长白山怎么玩?3天2晚天池攻略,有些坑帮你们踩过了 一句话总结:这次带父母去长白山,我选了黑...