algorithm - 如何优雅且命令式地生成字母表的第 n 个字符串?

标签 algorithm language-agnostic

给定一个字母表,例如:["a","b","c","d"],由该字母表的字符组成的所有字符串的序列是:

""
"a"
"b"
"c"
"d"
"aa"
"ab"
"ac"
...

Haskell 可以优雅地递归生成该序列的第 n 个元素:

nth :: Int -> String
nth n = reverse $ alphabet !! n where
    alphabet = [""] ++ concatMap (\ str -> map (: str) "abcd") alphabet

但这效率很低。使用基本转换,您可以尝试强制生成它(仅使用 JavaScript 进行演示):

function nth(n) {
  var str = "";
  while (n > 0) {
    str += String.fromCharCode(97 + n % 4);
    n = Math.floor(n / 4);
  }
  return str;
};

for (var i = 0; i < 64; ++i) {
  console.log(nth(i));
}

但这实际上会生成以下序列:

""
"b"
"c"
"d"
"ab"
"bb"
"cb"
"db"
"ac"
"bc"
"cc"
"dc"
"ad"
"bd"
"cd"
"dd"
"aab"

这不是我们想要的:请注意缺少的“a”、“aa”、“ba”等。我可能缺少一些简单的操作来修复命令式实现,因此,我的问题是:是否有任何强制生成字母表第 n 个字符串的优雅方法?

最佳答案

在 while 循环的开头插入 n--。如果您希望结果按字典顺序排列,请在打印之前反转字符串。

关于algorithm - 如何优雅且命令式地生成字母表的第 n 个字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50049375/

相关文章:

arrays - 在数组中查找圆的算法

sql - 开始和结束时间——每小时/每天/每周有多少并发事件等

language-agnostic - 评估骰子滚动符号字符串

algorithm - 给定序列的平衡索引 : What is the best algorithm to find one?

java - 用于检查二进制数组是否可以旋转以使元素总和不超过 1 的快速算法

algorithm - 只有叶子的最小生成树?

python - Dataframe 中两个对象之间的最小差异

algorithm - 用于在多个条件下做出决策的数据结构

language-agnostic - 是否有任何语言具有一元 bool 切换运算符?

language-agnostic - 记录横切关注点需要访问数据层