我想创建一个应该从序列
返回第n个字符串的函数 a, b, c, ... , z, aa, ab, ... , az, ba, ... , zz, aaa, ...
给定数量n(索引从零开始)。
这是我目前的职能:
const charCode = 'a'.charCodeAt(0);
function identName(a){
var b = '';
while(a){
b = String.fromCharCode(charCode + a % 26) + b;
a = a / 26 | 0;
}
return b || 'a';
}
有26个字母,所以我除以26并且每次将余数(模26)的char代码连接到字符串b
。不过这是输出:
a b c d e f g h i j k l m n o p q r s t u v w x y z ba bb bc bd be ...
如您所见,两个字母的字符串从ba
开始。我试着在每次迭代中减少1,但结果是这样的:
a a b c d e f g h i j k l m n o p q r s t u v w x y a' aa ab ac ad ...
有两次字符串a
,没有z
。我究竟做错了什么?如何以最佳和快速的方式正确生成此序列?
我真的没有看到我的问题中不清楚的地方。我只想要一个像identName(0)
这样调用的函数并返回"a"
,当这样调用identName(1)
时返回"b"
等等,当这样调用时:{ {1}}返回identName(26)
,依此类推。如何更简单地描述。我真的不喜欢这里不清楚的事情......:/
答案 0 :(得分:0)
这应该可以解决问题。
const charCode = 'a'.charCodeAt(0);
var identName = function (a) {
var b = [a], sp, out, i, div;
sp = 0;
while(sp < b.length) {
if (b[sp] > 25) {
div = Math.floor(b[sp] / 26);
b[sp + 1] = div - 1;
b[sp] %= 26;
}
sp += 1;
}
out = "";
for (i = 0; i < b.length; i += 1) {
out = String.fromCharCode(charCode + b[i]) + out;
}
return out;
}
基本上,每次进入过渡时,你都会跳过0个位置,例如27 - &gt; 0,0而不是1,0。