javascript - 如何有效地增加字母表中的值
问题描述
假设您有一个按以下顺序包含这些字符的字母表:
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) {
}
或者也许它可以以不同的方式完成,我不确定。
解决方案
@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"
推荐阅读
- java - 如何在不使用数组的情况下从给定数字中找到第二大数字
- bootstrap-4 - 引导列一起移动
- google-sheets - 查询选择日期等于工作表中的今天
- ios - 谷歌使用查询字符串放置restful api而不在搜索ios上给出响应
- django - Django-import-export 自定义相关字段
- angular - Angular反应形式,它的初始化未验证
- c - 如何在 C 中使用此代码进入 while 循环
- java - Android:获取 SD 存储中图像的整数值?
- python - PyQT 不同的图像自动缩放模式
- windows - Microsoft Azure 备份 (MARS) 未从计划任务运行