3.2 电话号码对应的英语单词

2024-05-28 15:58

本文主要是介绍3.2 电话号码对应的英语单词,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 前言

本文的一些图片, 资料 截取自编程之美

2. 问题描述

这里写图片描述

3. 问题分析

一个数字, 对应一个字符数组, 这个问题其实就是穷举出这个数字数组能够表示的所有的字符的拼凑, 然后找出为单词的序列
这里 我只做了穷举 “数字数组 -> 字符序列”

解法 : 使用一个pos数组, 来表示使用第i个数字的第pos[i]个字符, 然后设计一个累增的方法incPos来控制pos的增长, 至于迭代方式 可以选用循环, 也可以使用递归

这里的wordsToNumber01 表示输入一个字符序列, 获取其数字表示, 比较简单 这里就不说了

4. 代码

/*** file name : Test04PhoneNumberMapWords.java* created at : 9:38:08 AM May 27, 2015* created by 970655147*/package com.hx.test04;public class Test04PhoneNumberMapWords {// 枚举出手机号码 到字符的所有映射public static void main(String []args) {int[] numberLen = new int[] {0, 0, 3, 3, 3, 3, 3, 4, 3, 4 };  char[][] numberMap = initNumberMap(numberLen);int[] number = new int[] {9, 2, 3 };int[] pos = new int[] {0, 0, 0 } ;//      phoneNumberMapWords01(numberMap, numberLen, number, pos);phoneNumberMapWords02(numberMap, numberLen, number, pos);char[] str = new char[] {'z', 'c', 'e' };int[] dict = initDict(numberLen);wordsToNumber01(dict, str);}// 思路 : 更新pos的最后一位  如果需要进位   在循环更新pos最后一位之前的数据// numberMap 表示数字到字母的映射, numberLen表示每一个映射的长度// number 表示号码是多少, pos表示当前字符在对应号码的索引public static void phoneNumberMapWords01(char[][] numberMap, int[] numberLen, int[] number, int[] pos) {int lastOne = pos.length - 1;boolean isEnd = false;while(!isEnd ) {    for(int i=0; i<number.length; i++) {Log.logWithoutLn(numberMap[number[i]][pos[i]] + " ");}Log.enter();// 更新posisEnd = incPos(numberLen, number, pos);}}// 递归实现  不过本质基本一样[尾递归会优化为循环]public static void phoneNumberMapWords02(char[][] numberMap, int[] numberLen, int[] number, int[] pos) {for(int i=0; i<number.length; i++) {Log.logWithoutLn(numberMap[number[i]][pos[i]] + " ");}Log.enter();boolean isEnd = incPos(numberLen, number, pos);if(!isEnd ) {phoneNumberMapWords02(numberMap, numberLen, number, pos);}}// 利用字母到数字的映射  映射str的每一个字符public static void wordsToNumber01(int[] dict, char[] str) {int[] res = new int[str.length];int a = 'a';int idx = 0;for(int i=0; i<str.length; i++) {int idx0 = str[i] - a;res[idx ++] = dict[idx0];}Log.logWithoutPosition(res);}// 递增pos  如果到达了最大值   则返回falseprivate static boolean incPos(int[] numberLen, int[] number, int[] pos) {int lastOne = pos.length - 1;pos[lastOne] ++;    int idx = lastOne;while(pos[idx] == numberLen[number[idx] ] ) {if(idx == 0) {return true;}pos[idx] = 0;idx --;pos[idx] ++;}return false;}// 初始化数字到字母的映射表private static char[][] initNumberMap(int[] numberLen) {char[][] numberMap = new char[10][4];char idx = 'a';for(int i=0; i<numberLen.length; i++) {for(int j=0; j<numberLen[i]; j++) {numberMap[i][j] = idx++;}}return numberMap;}// 初始化字符到数字的映射表private static int[] initDict(int[] numberLen) {int[] res = new int[26];int a = 'a', z = 'z';int idx = 0, cnt = 0;for(int i=a; i<=z; i++) {while(cnt == numberLen[idx]) {idx ++;cnt = 0;}res[i-a] = idx;cnt ++;}return res;}}

5. 运行结果

这里写图片描述

6. 总结

这个问题不是很难, 但是设计方法的时候, 需要注意一些细节的问题

注 : 因为作者的水平有限,必然可能出现一些bug, 所以请大家指出!

这篇关于3.2 电话号码对应的英语单词的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011018

相关文章

[英语单词] paste

这个单词的意思,有时候可能会被,被copy/paste误导了,会有一种假象,只有copy了才可以paste。 其实还可以将两个东西paste在一起。比如下面的: /kernel/include/linux/compiler_types.h /* Indirect macros required for expanded argument pasting, eg. __LINE__. */#d

定位cpu占用过高的线程和对应的方法

如何定位cpu占用过高的线程和对应的方法? 主要是通过线程id找到对应的方法。 1 查询某个用户cpu占用最高的进程号 top -u 用户名 2 查询这个进程中占用cpu最高的线程号 top –p 进程号-H    3 查询到进程id后把进程相关的代码打印到jstack文件 jstack -l pid > jstack.txt 4 在jstack文件中通过16进制的线程id搜索到

一台电脑对应一个IP地址吗?‌探讨两台电脑共用IP的可能性

在当今数字化时代,‌IP地址作为网络世界中的“门牌号”,‌扮演着至关重要的角色。‌它负责在网络上唯一标识每一台设备,‌使得数据能够在庞大的互联网中准确无误地传输。‌然而,‌对于IP地址与电脑之间的对应关系,‌许多人可能存有疑惑:‌一台电脑是否必须对应一个IP地址?‌两台电脑又是否可以共用一个IP地址呢?‌本文将深入探讨这些问题,‌带您一窥IP地址背后的奥秘。‌ 一台电脑对应一个IP地址吗?‌

第十七题:电话号码的字母组合

题目描述 给定一个仅包含数字 2-9 的字符串,返回所有可能的由它组成的字母组合。你可以假设输入字符串至少包含一个数字,并且不超过3位数字。 实现思路 使用哈希表或数组存储每个数字对应的字符,然后通过递归或迭代的方式生成所有可能的组合。如果字符串长度为n,则可以看作是n层循环,每层循环可以选择对应数字的所有字符之一。 算法实现 C语言实现 #include <stdio.h>#inc

git如何灵活切换本地账号对应远程github的两个账号

git如何灵活切换本地账号对应远程github的两个账号 问题: 有时候我们会同时维护两个github的账号里面的仓库内容,这时候本地git需要频繁的切换ssh,以方便灵活的与两个账号的仓库可以通信。这篇日记将阐述我是怎么解决这个问题的。1. 第一个账户 生成本地SSH2. 注意 我们要设置第二个账户的 本地 SSH 时3. 两个账号来回切换 问题: 有时候我们会同时维护两个git

一台笔记本电脑的硬件都有哪些以及对应的功能

一台笔记本电脑的硬件通常包括多个关键组件,这些组件共同协作,确保电脑的正常运行。以下是笔记本电脑的主要硬件及其功能: 1. 中央处理器(CPU) 功能:CPU 是电脑的“大脑”,负责处理所有的计算和指令执行。它执行操作系统和应用程序的指令,控制其他硬件设备。常见品牌:Intel(如 Core i3/i5/i7/i9)、AMD(如 Ryzen 系列)。 2. 内存(RAM) 功能:内存用于存

Spring是如何找到URL请求对应的Controller的

文章来源 原文作者:Spring MVC 原文地址: https://blog.csdn.net/hl233211/article/details/77450697 http://ddrv.cn/a/58528 本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。 序:先贴一张SpringMVC整体的框架原理图 此文主要描述Spring在响应请求的时候是如何根据U

代码随想录算法训练营第十九天| 回溯理论、77. 组合、216. 组合总和Ⅲ、17. 电话号码的字母组合

今日内容 回溯的理论基础leetcode. 77 组合leetcode. 216 组合总和Ⅲleetcode. 17 电话号码的字母组合 回溯理论基础 回溯法也叫回溯搜索法,它是一种搜索的方式,而且只要有递归就会有回溯,回溯就是递归的副产品。 回溯说到底并不是什么非常高深的搜索方式,本质上仍然是穷举,穷举所有可能然后选择出我们要的答案。剪枝会使回溯法更加高效一点,但改变不了回溯本质就是穷举

Eclipse下的插件tomcat和桌面的tomcat下的项目不对应问题

这两天遇到一个小问题,经过近两个小时的奋战,不断Google,百度,解决问题。 问题描述如下: 在Eclipse下运行一个动态web项目,如果Eclipse下安装了tomcat的插件,那么可以正常运行。 有个问题出现了,如果我想把这个编译后的web项目,挪到其他机器上的tomcat服务器下跑,怎么弄啊! 因为找不到编译后的文件在哪儿,无法挪动!要能把编译后的文件自动挪到机子上tom

NXOPEN1847开发环境搭建-对应VS2017

1、VS2017离线下载路径(半夜下载快) 链接:https://pan.baidu.com/s/1N_1Jyk4mHQx0tQ7V2vNckg 提取码:637g 2、NX1847下载路径 迅雷下载连接:magnet:?xt=urn:btih:B3C6A852FFACDFD226E53B12F3CFDFB57D4799B1 3、VS安装最好第一次把相关模块都选上,特别是 标准库模块 安装上,否则后