资讯专栏INFORMATION COLUMN

如何快速将 '*' 重复 9 次?

NeverSayNever / 3174人阅读

摘要:如果是将重复次,一下子就可以想到这种快速算法用代码实现同样的算法可用于次次次次但是如果是要求重复次呢这就需要调整一下上述的算法。

如果是将 "*" 重复 8 次,一下子就可以想到这种快速算法:

"*" + "*" => "**"

"**" + "**" => "****"

"****" + "****" => Bingo!

JavaScript 代码实现:

var n = 8;
var str = "*";
while ((n >>>= 1) > 0) {
  str += str;
}
console.log(str);

同样的算法可用于 16 次、32 次、64 次、1024 次...

但是如果是要求重复 9呢?这就需要调整一下上述的算法。

先抽象出一个函数 repeat: (str: string, n: number) => string:

repeat("*", 3) => "***"

repeat("ab", 1) => "ab"

repeat("abcd", 0) => ""

...

然后开始分析:

n 为偶数时:

repeat(str, n) <= repeat(str, n >>> 1) + repeat(str, n >>> 1)

比如:repeat("abc", 12) <= repeat("abc", 6) + repeat("abc", 6)

n 为奇数时,即 n - 1 为偶数:

repeat(str, n) <= str + repeat(str, n - 1)

比如:repeat("*", 21) <= "*" + repeat("*", 20)

n1 时:repeat(str, 1) <= str

n0 时:repeat(str, 0) <= ""

JavaScript 代码实现:

function repeat(str/*:string*/, n/*:number*/) {
  if (n === 0) return "";
  if (n === 1) return str;
  // `n` 为奇数
  if (n % 2) return str + repeat(str, n - 1);

  // `n` 为偶数,
  // 但是要把 `repeat(str, n >>> 1)` 缓存起来,
  // 以避免重复两次计算
  return (str = repeat(str, n >>> 1)) + str;
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/91988.html

相关文章

  • JS 中为啥 [&#039;1&#039;, &#039;7&#039;, &#039;11

    摘要:如果我们把非布尔值作为条件呢打开控制台并运行上述代码,会打印说明条件为真值。在中,真值指的是在布尔值上下文中转换后的值为真的值。两个能够建立元素间一一对应的集合称为互相对等集合。 showImg(https://segmentfault.com/img/bVbtSvt?w=720&h=360); 为了保证可读性,本文采用音译而非直译。 Javascript 一直是神奇的语言。 不相信我...

    yuanzhanghu 评论0 收藏0
  • [python] 初探&#039;函数式编程&#039;

    摘要:前言继续向下看廖大教程,看到了函数式编程这一节,当时是觉得没啥用直接跳过了,这次准备要仔细看一遍了,并记录下一些心得。 前言 继续向下看廖大教程,看到了函数式编程这一节,当时是觉得没啥用直接跳过了,这次准备要仔细看一遍了,并记录下一些心得。 函数式编程 上学期有上一门叫 人工智能 的课,老师强行要我们学了一个叫做 prolog 的语言,哇那感觉确实难受,思维方式完全和之前学过的不一样,...

    xcc3641 评论0 收藏0
  • What&#039;s New in JavaScript

    摘要:在和中都保留了数组的强引用,所以在中简单的清除变量内存并没有得到释放,因为还存在引用计数。而在中,它的键是弱引用,不计入引用计数中,所以当被清除之后,数组会因为引用计数为而被回收掉。其实我们主要注意的引用是不计引用计数的,就好理解了。 showImg(https://segmentfault.com/img/remote/1460000019147368?w=900&h=383); 前...

    cgh1999520 评论0 收藏0
  • 精读《What&#039;s new in javascript》

    摘要:举例来说即便某个失败了,也不会导致的发生,这样在不在乎是否有项目失败,只要拿到都结束的信号的场景很有用。对于则稍有不同只要有子项,就会完成,哪怕第一个了,而第二个了,也会,而对于,这种场景会直接。 1. 引言 本周精读的内容是:Google I/O 19。 2019 年 Google I/O 介绍了一些激动人心的 JS 新特性,这些特性有些已经被主流浏览器实现,并支持 polyfill...

    dabai 评论0 收藏0
  • 关于vue带hash &#039;#/&#039; 微信分享后点开链接是首页的问题

    摘要:在调用微信分享的时候如是这样带有的分享后,打开分享后的是关于这部分是微信加的。解决方法将分开将前后分开,微信就不会将拼接到之后得到的结果是,第一次打开还是会进入到,第二次打开才会进入到使用重定向在文件夹下,新建。内容然后这样就跳转完成 在调用微信分享api的时候: let shareUrl = https://xxxx#/abc wx.onMenuShareTimeline({ ...

    calx 评论0 收藏0

发表评论

0条评论

NeverSayNever

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<