var ShortURL = new function() {
var _alphabet = '23456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ-_',
_base = _alphabet.length;
this.encode = function(num) {
var str = '';
while (num > 0) {
str = _alphabet.charAt(num % _base) + str;
num = Math.floor(num / _base);
}
return str;
};
this.decode = function(str) {
var num = 0;
for (var i = 0; i < str.length; i++) {
num = num * _base + _alphabet.indexOf(str.charAt(i));
}
return num;
};
};
我知道编码的原理是将十进制数转换为自定义进制(在这种情况下是自定义字母表/数字)
我不太确定解码的工作原理。 为什么我们要将基数乘以当前数字,然后加上字母表的位置号码?我知道将二进制数010转换为十进制数时,我们会这样做
(2 * 0^2) + (2 * 1^1) + (2 * 0 ^ 0) = 2
不确定它在解码算法中是如何表示的。
编辑: 我的解码版本
this.decode2 = function (str) {
var result = 0;
var position = str.length - 1;
var value;
for (var i = 0; i < str.length; i++) {
value = _alphabet.indexOf(str[i]);
result += value * Math.pow(_base, position--);
}
return result;
}
这是我编写的自己的解码版本(就像我想在纸上转换一样)。我希望有人能更详细地解释第一个解码版本的工作原理。仍然不明白为什么要将 num * base 相乘并以 0 开头。
0
或1
。 - PointyaeiouAEIOU
- Mulano
和l
混淆。你还会注意到i
或I
不在其中。我不确定为什么a
和A
也不在其中。或者任何元音,但这可能是为了防止意外拼写单词。 - Nathan K_alphabet.length
。 - Mulan