1

我有一个以 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);

离正确答案不远,但它仍然是错误的。

该函数的正确形式是什么?

4

1 回答 1

2

我概括了解决方案,并提供了一些测试数据:

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, ... )

于 2014-09-12T20:28:25.960 回答