《程序员面试金典(第6版)》面试题 16.20. T9键盘(哈希映射,C++)

news/2025/1/2 2:15:19/

题目描述

在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表。每个数字映射到0至4个字母。给定一个数字序列,实现一个算法来返回匹配单词的列表。你会得到一张含有有效单词的列表。(原题链接)

映射如下图所示:
在这里插入图片描述

示例 1:

输入: num = "8733", words = ["tree", "used"]
输出: ["tree", "used"]

示例 2:

输入: num = "2", words = ["a", "b", "c", "d"]
输出: ["a", "b", "c"]

提示:

  • num.length <= 1000
  • words.length <= 500
  • words[i].length == num.length
  • num中不会出现 0, 1 这两个数字

解题思路与代码

这道题呢,是一道不算太难的题。因为其实很好有思路。

为什么呢?看到这个键盘,我脑子里就出现了俩字,那就是“映射”,对,你猜的没错,这道题其实就是去用哈希映射来解题。

哈希映射做的越好,你这道题的复杂度其实也就越低。

那么接下来我们就看看如何用哈希映射来解决这个问题。

方法一: 使用unordered_map来解决这个问题。

  • 其实真的很简单。我们创建一个unordered_map<char,char> map,前面的key方的是26个因为字符,后面的value对应的是字符对应的数字。再创建一个结果集result。
  • 之后用一个双层for循环去做遍历好了。外层for循环去遍历words里面的每一个单词,内层for循环去遍历每一个单词中的每一个字符。
  • 我们用一个标记去判断内层的字符是否与num中的字符相对应。如果都对应,则添加到result之中。
  • 最后返回result即可。

具体代码如下:

class Solution {
public:vector<string> getValidT9Words(string num, vector<string>& words) {vector<string> result;unordered_map<char,char> map;for(int i = 0; i < 15; ++i)map['a' + i] = '0' + i / 3 + 2;for(int i = 15; i < 19; ++i)map['a' + i] = '0' + 7;for(int i = 19; i < 22; ++i)map['a' + i] = '0' + 8;for(int i = 22; i < 27; ++i)map['a' + i] = '0' + 9;for(int i = 0; i < words.size(); ++i){bool flag = true;for(int j = 0; j < words[i].size(); ++j)if(map[words[i][j]] != num[j]){flag = false;break;}if(flag) result.push_back(words[i]);}return result;}
};

在这里插入图片描述

复杂度分析

时间复杂度:

  • 在最坏的情况下,你需要检查所有的单词(长度为n的单词有m个)。对于每个单词,你需要检查所有的字母(最多n个),以确保它们都与给定的数字字符串匹配。因此,时间复杂度是O(mn),其中m是单词列表的长度,n是单词和数字字符串的长度。

空间复杂度:

  • 你使用了一个哈希表来存储字母到数字的映射,这个表的大小是固定的(26个英文字母),因此空间复杂度是O(1)。但是,如果考虑输出的空间,那么在最坏的情况下,你可能需要存储所有的单词,这将使空间复杂度变为O(m)。

方法二:优化!使用vector去做哈希映射

这种方法比上一种方法更多的去节省了内存的空间,由于我们在时间复杂度上真的已经做的很优秀了,所以没有什么办法去改进时间复杂度。

这种方法其实就是把26个字母对应的数字全部都遍历到一个vector里,然后其他步骤,和上一种做法无二差,但是节省了空间去存储字符,这种做法不需要去把字母作为key。

具体的代码如下:

class Solution {
public:vector<string> getValidT9Words(string num, vector<string>& words) {vector<string> result;vector<char> map {'2','2','2','3','3','3','4','4','4','5','5','5','6','6','6','7','7','7','7','8','8','8','9','9','9','9'};for(int i = 0; i < words.size(); ++i){int flag = true;for(int j = 0; j < words[i].size(); ++j)if(map[words[i][j] - 'a'] != num[j]){flag = false;break;}if(flag) result.push_back(words[i]);}return result;}
};

在这里插入图片描述

复杂度分析

时间复杂度:O(mn),其中m是单词的数量,n是单词的长度
空间复杂度:O(m),其中m是单词的数量。

总结

这道题目主要考察了以下几个方面的知识和技能:

  • 哈希映射:这道题目需要你设计一个哈希映射来实现字母到数字的转换。哈希映射是一种常见的数据结构,可以用来高效地查找和存储数据。

  • 字符串处理:你需要处理输入的字符串,包括分析单词和数字序列,这要求你具有基本的字符串操作技巧。

  • 逻辑思维和细节处理:你需要设计一个算法来判断单词是否与数字序列匹配,这需要你具有清晰的逻辑思维和对细节的把握。

此外,这道题目还具有实际的应用价值。例如,一些老式的手机键盘输入法就是使用类似的方法来实现的。每个数字键都对应几个字母,用户可以通过输入数字序列来输入单词。因此,理解和解决这个问题可以帮助你更好地理解这些实际应用背后的原理。

最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容


http://www.ppmy.cn/news/65938.html

相关文章

在 oracle 中执行 sql 语句时,报错:“ORA-00001: 违反唯一约束条件 SYS_C0024202”

在 oracle 中执行 sql 语句时&#xff0c;报错&#xff1a;“ORA-00001: 违反唯一约束条件 SYS_C0024202” 报错信息如下&#xff1a; 表为“WK_ADMIN_USER” 解决方法&#xff1a; 1、查看违反约束的序列对应的数据库表与字段 select a.constraint_name,a.constraint_type,b…

8. 类的静态成员

一、对象的生产期 生存期&#xff1a;对象从诞生到结束的这段时间生存期分为静态生存期和动态生存期 1.1 静态生存期 对象的生存期与程序的运行期相同&#xff0c;则称它具有静态生存期在文件作用域中声明的对象都是具有静态生存期的若在函数内部的局部作用域中声明具有静态…

opencv_c++学习(六)

一、视频加载与摄像头调用 视频、摄像头加载 VideoCapture(filename, CAP_ANY)对以上实例解释如下&#xff1a; 若读取的为本地视频&#xff0c;则filename为视频名称&#xff0c;若读取的是摄像头数据&#xff0c;则为int类型的摄像头id。 视频属性的获取 视频属性可以通过…

OpenGL超级宝典第七章学习笔记:顶点处理与绘图命令

前言 本篇在讲什么 OpenGL蓝宝书第七章学习笔记 本篇适合什么 适合初学OpenGL的小白 本篇需要什么 对C语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&…

vue+elementui+nodejs校园高校餐厅点餐及订餐菜品推荐评价系统6927k

传统的销售模式&#xff0c;在实体店的紧跟式的销售模式&#xff0c;会给消费者一种不自由&#xff0c;被监视的感觉。餐厅点餐及推荐系统&#xff0c;紧跟数据时代的步伐&#xff0c;使用nodejs开发语言&#xff0c;配备MySQL数据库。扎根于实际问题所开发出来的一套系统。这个…

一百一十、Hive时间转换——from_unixtime踩坑(不要用from_unixtime,而是用from_utc_timestamp)

1.详情 从kettle转换任务得到时间戳为13位&#xff0c;1683701579457。想看看这个时间戳与createTime字段的关系&#xff0c;于是一开始使用了from_unixtime&#xff0c;结果踩坑了 2.运行问题&#xff08;晚8个小时&#xff09; hive> select from_unixtime(cast(1683701…

基于 TiDB + Flink 实现的滑动窗口实时累计指标算法

作者&#xff1a;李文杰 前言 在不少的支付分析场景里&#xff0c;大部分累计值指标可以通过 Tn 的方式计算得到 。随着行业大环境由增量市场转为存量市场&#xff0c;产品的运营要求更加精细化、更快速反应&#xff0c;这对各项数据指标的实时性要求已经越来越高。产品如果能…

c# The handshake failed due to an unexpected packet format 异常处理

异常信息&#xff1a; System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send. ---> System.IO.IOException: The handshake failed due to an unexpected packet format.at System.Net.Security.SslState.StartReadFra…