var repeat = function (str, n) {
var res = '';
while (n) {
if (n % 2 === 1) { res += str; }
if (n > 1) { str += str; }
n >>= 1;
}
return res
};
var repeat = function (str, n) {
var res = '';
while (n) {
if (n % 2 === 1) { res += str; }
if (n > 1) { str += str; }
n >>= 1;
}
return res
};
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
这样写可以把循环次数从 n 次优化到 log2(n) 次。
把 n 写成二进制形式,从低位到高位遍历,每移动一位意味着基数翻一倍,这一位为0意味着不计入结果,为1意味着计入结果。
比如要循环字符 “abc” 11 次,11 写成二进制:1011
基数对应字符串刚好是上一次的翻倍,这就是
if (n > 1) { str += str; }
的意思。因为 11 = 1 + 2 + 8,所以循环 11 次的字符串就等于列对应的底下的字符串相加。