当前位置: 首页 > 面试题库 >

算法问题:字母组合

易宏阔
2023-03-14
问题内容

我正在尝试编写一段代码来执行以下操作:

取数字0到9,并给该数字分配一个或多个字母。例如:

0 = N,
1 = L,
2 = T,
3 = D,
4 = R,
5 = V or F,
6 = B or P,
7 = Z,
8 = H or CH or J,
9 = G

当我有0123这样的代码时,对它进行编码很容易。显然,它将组成代码NLTD。当引入数字5,6或8时,情况会有所不同。051之类的数字可能会导致多种可能性:

NVL和NFL

显而易见,较长的数字甚至包括5、6或8这样的数字,甚至会变得“更糟”。

由于对数学非常不好,我还无法提出一个像样的解决方案,该解决方案无法让我为程序提供大量数字,并吐出所有可能的字母组合。因此,我希望获得一些帮助,因为我似乎无法弄清楚。挖掘一些有关排列和组合的信息,但是没有运气。

感谢您的任何建议/提示。我需要编写代码的语言是PHP,但是任何常规提示将不胜感激。

更新:

更多背景信息:(非常感谢您的快速回复!)

我的问题背后的想法是建立一个脚本,该脚本将帮助人们轻松地将他们想记住的数字转换为更容易记住的单词。有时将其称为“伪命理学”。

我希望脚本给我所有可能的组合,然后将其组合到剥离单词数据库中。这些被剥离的单词仅来自词典,而我在问题中提到的所有字母都被剥离了。这样,要编码的数字通常可以轻松地与一个或多个数据库记录相关。发生这种情况时,您最终会得到一个单词列表,可以用来记住要记住的数字。


问题答案:

您要保留数字->字母分配的一般结构是一个或多个数组,类似于:

// 0 = N, 1 = L, 2 = T, 3 = D, 4 = R, 5 = V or F, 6 = B or P, 7 = Z, 
// 8 = H or CH or J, 9 = G
$numberMap = new Array (
    0 => new Array("N"),
    1 => new Array("L"),
    2 => new Array("T"),
    3 => new Array("D"),
    4 => new Array("R"),
    5 => new Array("V", "F"),
    6 => new Array("B", "P"),
    7 => new Array("Z"),
    8 => new Array("H", "CH", "J"),
    9 => new Array("G"),
);

然后,一些递归逻辑为我们提供了类似于以下功能

function GetEncoding($number) {
    $ret = new Array();
    for ($i = 0; $i < strlen($number); $i++) {
        // We're just translating here, nothing special.
        // $var + 0 is a cheap way of forcing a variable to be numeric
        $ret[] = $numberMap[$number[$i]+0];
    }
}

function PrintEncoding($enc, $string = "") {
    // If we're at the end of the line, then print!
    if (count($enc) === 0) {
        print $string."\n";
        return;
    }

    // Otherwise, soldier on through the possible values.
    // Grab the next 'letter' and cycle through the possibilities for it.
    foreach ($enc[0] as $letter) {
        // And call this function again with it!
        PrintEncoding(array_slice($enc, 1), $string.$letter);
    }
}

递归三声欢呼!这将通过以下方式使用:

PrintEncoding(GetEncoding("052384"));

并且,如果您真的希望将其作为数组,请使用输出缓冲并使用“ \ n”作为拆分字符串进行爆炸。



 类似资料:
  • 017. Letter Combinations of a Phone Number[M] 问题 Given a digit string, return all possible letter combinations that the number could represent. A mapping of digit to letters (just like on the telephon

  • 例如,如果第一个< code > CharAt(0)= ' w ' ,我正在处理从用户输入得到的输出,以便只显示奇数或偶数。 它是否通过“System.out.println(CharAt(0)CharAt 2)CharAt(4))”工作? 我正在使用扫描仪项目获得用户输入,并已经有以下输入部分: 有没有办法只拥有像(0 奇数)这样的公式?

  • 前言 算法主要包括: 1、排序 排序一定要准备。 2、堆栈、队列、链表 队列和链表可以不准备,但是堆栈一定要准备。 一个小技巧:JS的数组本身就具备堆栈和队列的特性。比如:top、push、shift、unshift这四个api,本身就帮我们实现了堆栈和队列。 堆栈:先进后出。 3、递归 递归是一定不能偷懒的。算法比较难的时候,一般要用到递归。 4、波兰式和逆波兰式 总结: 比如阿里,如果基础题答

  • Angel是一个分布式机器学习平台,在上面运行算法,得到模型,这只是第一步,更加关键第二步,训练出来模型,要有比较好的准确率,可以对数据进行准确预测。在这个过程中,用户可能会遇到各种各样的问题,这里我们也一一总结一下 LR 模型不收敛,预测效果差 请检查正则项系数是否适合,过大的正则项参数会影响模型收敛,建议不大于 1/featureNum 检查Learn Rate是否过大 检查数据预处理是否有做

  • 因此,我试图提出一种算法,在字符串数组中查找带有特定字符/字母的单词。 有没有一个聪明的方法,也许通过排序列表,然后以某种方式搜索? 另外,这个算法的运行时间是多少?它会被认为是O(n)还是O(n*m)?其中n是字典中的单词数,m是数组中每个单词的长度。

  • 要求你写一份关于以下算法问题的报告:这道题要求你在一组真币中找出一个假币。这枚假硬币之所以能被找到,是因为它和其余的真硬币的重量不一样。不是轻了就是重了,只是你事先不知道。你要做决定的唯一方法是一个经典的带有两个托盘的天平秤。你可以把一个或多个硬币放在一个托盘上,一个相似的数字放在另一个托盘上,并确定哪个托盘有较轻的一堆。例如,如果你只有三个硬币,那么拿硬币1和硬币2称重。如果天平平衡,那么硬币3