我有一个基数为10的输入:1, 2, 3, 52, 53 ...
我想将数字转换为使用字母a
和z
构建的字符串。对于每个数字,应该只有一个字母组合,它们应按字母顺序排序。
0 => A
1 => B
2 => C
26 => AA
27 => AB
52 => BA
53 => BB
...
目前我构建了这个代码段:
var possibleIndexes = "abcdefghijklmnopqrstuvwxyz".split("");
var result = '';
var index10 = 52;
var index26 = (index10).toString(26);
for (var i = 0; i < index26.length ; i++) {
result += possibleIndexes[(parseInt(index26[i], 26)) % 26];
}
console.log(result);
距离正确答案还不远,但仍然是错误的。
该功能的正确形式是什么?
答案 0 :(得分:3)
我概括了解决方案,并提供了一些测试数据:
function f(xx) {
var v = "abcdefghijklmnopqrstuvwxyz".split("");
var result = '';
var nr = Math.floor(xx/26);
var mod = xx%26;
for ( var j = 1, jj = 1 ; j <= nr ; j=Math.pow(26,jj)+1, jj++ ) {
result += v[(nr-1)%26];
}
result += v[mod];
return result;
}
/* USEFUL FOR TESTS */
var arr = [0, 1, 25, 26, 52, 53, 701, 702, 17601, 17602, 457001, 457002];
var expected = ['a','b','z','aa', 'ba', 'bb', 'zz', 'aaa', 'zzz', 'aaaa', 'zzzz', 'aaaaa'];
for ( var k = 0 ; k < arr.length ; k++ ) {
console.log(arr[k] + " --> " + f(arr[k]) + "-->" + expected[k]);
}
考虑到与输出字符串的长度相关的可能解决方案的数量增长指数:
- A-Z +26^1 1-26
- AA-ZZ +26^2 27-702
- AAA-ZZZ +26^3 703-17602
- AAAA-ZZZZ +26^4 17603-457002
...
<强>详情:
mod
保留输出字符串的最新字符
j
以指数方式增长(26^0
,26^1
,26^2
...)并确保结果具有合适的字符数:
26^1+1 - 26^2 -> add one letter
26^2+1 - 26^3 -> add another letter
...
jj
仅用作指数(1 - 26^1
,2 - 26^2
,3 - 26^3
,...)