首页 > 解决方案 > 如何有效地增加字母表中的值

问题描述

假设您有一个按以下顺序包含这些字符的字母表:

abcdefghijklmnopABCDEFG123456789

然后,您希望将它们增加到任意长度。所以它开始时只有 1 个字符,然后是 2,然后是 3,然后是 ... n。

a
b
c
...
A
B
C
...
1
2
3
...
aa
ab
...
aA
aB
...
ba
bb
bc
...
bA
bB
...
za
zb
...
1a
1b
...
aaa
aab
aac
...
aba
abb
abc
...
aAa
aAb
...

所以它首先增加最右边的,然后是左边的,然后是左边的,等等。

这有点棘手。想知道如何做到这一点。

想知道如何做到这一点,以便它可以采用任何字母表,并将其构造为任何长度,所以它是通用的。

function getStringAtIndex(index, alphabetArray) {

}

或者也许它可以以不同的方式完成,我不确定。

标签: javascriptstringalgorithm

解决方案


@tehhowch 是完全正确的,而不是做十六进制(以 16 为底),你本质上是想做以 n 为底的数学。使用您指定的字符集,这将是 base-33 数学(如果您包含 0 字符)

每个小数位代表 n^x 次幂。用小数很容易。100 是 10^2,1000 是 10^3。这就是对数的含义:log(1000) base 10 = 3,因为 10^3 = 1000。

幸运的是,我们可以通过 log(n)/log(base) 获得任何基数的日志。因此有以下功能:

function convert(number) {
    var chars = '0abcdefghijklmnopABCDEFG123456789',
        base = chars.length, i = number, str = '',
        exp = Math.floor(Math.log(i)/Math.log(base))+1;
    while(exp--) {
        var bexp = Math.pow(base, exp);
        var j = Math.floor(i/bexp);
        i -= j*bexp;
        str += chars[j];
    }
    return str;
}
convert(90014234); // "bi62Gb"
convert(791424) // "F01B"
convert(23423); // "Ep3"
convert(33); // "a0"

您可以使用更常见的字符集(例如十六进制(以 16 为基数))来验证该方法,并确保数字正确。你会var chars = '0123456789abcdef'在函数中替换。然后我们指定一个十六进制数字并确保我们的输出匹配:

convert(0xdd5439af); // "dd5439af"

推荐阅读